对 MySQL 使用 MVC 应用程序和 MS Access 时记录被覆盖
Posted
技术标签:
【中文标题】对 MySQL 使用 MVC 应用程序和 MS Access 时记录被覆盖【英文标题】:Record overwritten when using both MVC app and MS Access against MySQL 【发布时间】:2017-05-11 09:25:38 【问题描述】:一些背景知识:我们开发了一个客户端的 MS Access 应用程序的 ASP.NET MVC 端口。应用程序通过 ODBC 使用/使用 mysql 作为数据存储。我们遇到的是,如果客户端使用 MS Access 应用程序捕获新记录,并且在 MVC 应用程序捕获新记录后不久,MVC 应用程序的记录似乎会覆盖 Access 应用程序创建的最后一条记录,如以及创建第二条记录。
所以实际上,Access 应用程序的记录起初看起来像这样
ID | NAME | SURNAME
1 | joe | Schmoe
但是,当 MVC 应用程序创建它的一条记录时,会发生这种情况:
ID | NAME | SURNAME
1 | james | smith
2 | james | smith
MVC 应用程序似乎覆盖了 Access 捕获的最后一条记录,并创建了一条新记录。
我们使用 Entity Framework 5。我们所做的只是保存记录
var record = new Person()NAME = "james", SURNAME = "smith";
db.People.Add(record);
db.SaveChanges();
这种事情只有在客户端使用了 Access 应用程序时才会发生。只有当最后添加的记录来自 Access 应用程序并且新记录来自 MVC/EF 应用程序时才会发生这种情况。
我们将不胜感激。
通过 Access 捕获记录序列时,不会发生这种情况。当通过实体框架捕获一系列记录时,它不会发生。首先通过 Entity Framework 和 THEN Access 捕获时,不会发生这种情况。仅当顺序为 Access 优先,Entity Framework 次之时才会发生。
【问题讨论】:
ID是否定义为数据库中的主键?另外,您确定在添加新记录之前您没有在 EF 上下文中执行任何其他操作吗? 是的,这是一个自动递增的PK。不,我们什么都不做。我只是在 EF 中创建一个新记录,添加它,然后调用 SaveChanges()。无论是 Access 还是 EF,它都能 100% 工作,但如上所述使用它们时却不行。 我会启用查询日志以查看在这些情况下 EF 问题的确切查询,也许您可以通过这种方式获得提示。 serverfault.com/questions/358978 你指定key是[DatabaseGenerated(DatabaseGenerationOption.Identity]
了吗?
是的。 [还需要 11 个字符]
【参考方案1】:
抱歉,没有足够的空间在评论中写下这个
一些建议:
您发布的代码不足以理解问题。至少您可以编写所有创建/使用 db 的代码(它只是在您发布的行之前的 using
吗?)
错误可能是从 EF 保存时。您可以开始在每个 SaveChanges 中插入一个断点,即使是您确定没有调用的断点
您可以做的其他事情是将 MySQL 与 SQL Server 交换(您的应用程序也可以与 SQL Server 完美配合,最困难的工作是更改 Access 中的链接,EF 已经可以工作)并检查您是否有同样的问题.
【讨论】:
不是代码问题。使用一个或另一个应用程序时,不会发生这种情况。只有当最后一条记录是通过 Access 应用程序创建并且下一条记录是通过网站创建时才会发生。这让我相信这是访问如何管理自动编号或其他东西的问题。这两个应用程序都非常成熟。他们只是不能很好地协同工作。 如果 DBMS 是 MySQL,则 Access 没有任何技巧可以用来写入和读取记录。它只能运行 DML 和 SQL... Access 不会“管理自动编号”我的 SQL 会。请注意,只有当 EF 在 Access 之后运行时才会出现问题,否则不会出现问题。 @Stoleg,“自动编号”是什么意思?如果您的意思是自动递增,Access 可以,但在这种情况下它不需要,因为后备存储是 MySQL,Access 只能运行 INSERT 查询(不指定 Id)来添加记录。 @bubi 我用的是你的术语。正确的设置是在 MySQL 表中将AUTO_INCREMENT
指定为属性。在这种情况下,数据库管理 ID:它将先前的最大值加一并将其插入 ID 列,因此您无需指定。在正常情况下,它也不允许在该列中插入重复值。请发布表和类定义,以获得更好的指导。【参考方案2】:
您将上下文保留多长时间?我希望它是短暂的,但怀疑它可能不是?
您是否查看过这个问题? Entity Framework Refresh context?
【讨论】:
上下文的范围是方法的生命周期,它位于业务逻辑层。流程如下:web request -> controller action -> new business().saverecord() -> return View(); 如果 Access 在 Web 请求发起 之前 创建记录,是否会出现问题? 老实说,我不知道。访问应用程序会在几分钟内打开新记录,而 Web 应用程序需要一两秒来创建记录。这些信息够吗? 老实说,如果上下文不同步是问题所在,我会感到惊讶,但我肯定会在添加。您是否尝试过实施任何刷新建议? 另外,您使用过 SQL Profiler 吗?与@bubi 关于记录 SQL 调用的观点类似,Profiler 会准确地告诉您数据库上正在调用什么。【参考方案3】:请尝试以下解决方案:
对于 PK 属性(如 ID),请确保 StoreGeneratedPattern=身份
这取自 MySQL 支持论坛discussion。
【讨论】:
【参考方案4】:请允许您的 SQL 表中的列自动递增,表定义应如下所示。
因为实体基于主键工作。因此,您必须定义 [Key] 属性。 DatabaseGenerated 用于自动递增。
您需要添加两个引用,如下所示。
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID get; set;
【讨论】:
以上是关于对 MySQL 使用 MVC 应用程序和 MS Access 时记录被覆盖的主要内容,如果未能解决你的问题,请参考以下文章