Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对MySQL同时使用MVC app和MS Access时记录被覆盖_C#_Mysql_Entity Framework_Ms Access_Odbc - Fatal编程技术网

C# 对MySQL同时使用MVC app和MS Access时记录被覆盖

C# 对MySQL同时使用MVC app和MS Access时记录被覆盖,c#,mysql,entity-framework,ms-access,odbc,C#,Mysql,Entity Framework,Ms Access,Odbc,一些背景:我们开发了一个客户端MS Access应用程序的ASP.NET MVC端口。应用程序通过ODBC使用MySQL作为数据存储。我们遇到的是,如果客户端使用MS Access应用程序捕获新记录,并且在MVC应用程序捕获新记录后不久,MVC应用程序的记录似乎会覆盖Access应用程序创建的最后一条记录,并创建第二条记录 所以实际上,Access应用程序的记录一开始是这样的 ID | NAME | SURNAME 1 | joe | Schmoe 但是,当MVC应用程序创建一条记录时

一些背景:我们开发了一个客户端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捕获的最后一条记录,并创建一条新记录

我们使用实体框架5。我们要做的就是保存记录

var record = new Person(){NAME = "james", SURNAME = "smith"};
db.People.Add(record);
db.SaveChanges();
只有当客户端使用了Access应用程序时,才会发生这种情况。只有当最后添加的记录来自Access应用程序,而新记录来自MVC/EF应用程序时,才会发生这种情况

如有任何意见,将不胜感激


通过Access捕获记录序列时,不会发生这种情况。当通过实体框架捕获一系列记录时,不会发生这种情况。当首先通过实体框架捕获,然后访问时,这种情况不会发生。只有当顺序是Access优先,Entity Framework第二时,才会发生这种情况。

很抱歉,没有足够的空间将其写入注释中

一些建议:

  • 您发布的代码不足以理解问题。至少您可以编写创建/使用db的所有代码(在您发布的行之前,它只是一个使用的

  • 可能是从EF保存时出错。您可以开始在每个SaveChanges中插入断点,即使是您确定没有调用的那些

  • 您可以做的另一件事是将MySQL与SQL Server交换(您的应用程序也可以与SQL Server完美地工作最困难的工作是更改Access中的链接,EF已经工作),并检查您是否存在相同的问题


您将上下文持续多长时间?我希望它是短暂的,但怀疑它可能不是


你复习过这个问题吗

请尝试以下解决方案:

对于PK属性(例如ID),请确保 StoreGeneratedPattern=Identity


这来自MySQL支持论坛。

请允许SQL表中的自动增量列,表定义如下所示

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID{ get; set; }
因为实体是基于主键工作的。因此,您必须定义[Key]属性。 数据库生成用于自动增量

您需要添加两个参考,如下所示

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID{ get; set; }

ID是否定义为数据库中的主键?另外,您确定在添加新记录之前没有在EF上下文中执行任何其他操作吗?是的,这是一个自动递增的PK。不,我们什么也没做。我只需在EF中创建一个新记录,添加它,然后调用SaveChanges()。它在Access或EF中都能100%正常工作,但在如上所述使用它们时就不行了。在这种情况下,我会让查询日志看到确切的查询EF问题,也许你可以通过这种方式得到提示。您是否已指定密钥为
[DatabaseGenerated(DatabaseGenerationOption.Identity)]
?是。[还需要11个字符]这不是一个代码问题。当使用一个或另一个应用程序时,这种情况不会发生。只有在通过Access应用程序创建最后一条记录,并通过网站创建下一条记录时才会发生。这让我相信Access如何管理自动编号或其他内容是一个问题。这两个应用程序都非常成熟。它们只是不能很好地协同工作。如果DBMS是MySQL,Access就无法使用任何技巧来写入和读取记录。它只能运行DML和SQL…Access不会“管理自动编号”,我的SQL会。请注意,只有当EF在Access之后运行时才会出现问题,而不是相反。@Stoleg,“自动编号”是什么意思?如果您指的是自动递增,Access会自动递增,但在本例中不需要,因为备份存储是MySQL,Access只能运行插入查询(不指定Id)添加记录。@bubi我用的是你的术语。正确的设置是在MySQL表中将
AUTO\u INCREMENT
指定为属性时。在这种情况下,数据库管理ID:它将一个最大值添加到上一个最大值,并将其插入到ID列中,所以你不需要指定它。它也不允许在norm下将重复值插入到该列中所有情况。为了获得更好的指导,请发布表和类定义。上下文的作用域是方法的生存期,它位于业务逻辑层。流程如下:web请求->控制器操作->新建业务()。saverecord()->返回视图();如果Access在web请求启动之前创建记录,是否会出现问题?老实说,我说不出来。Access应用程序会将新记录打开几分钟,而web应用程序需要一两秒钟来创建记录。这些信息是否足够?老实说,如果上下文不同步是问题所在,我会感到惊讶,但我肯定会在添加之前立即刷新EF对数据的了解。您是否尝试过实现任何刷新建议?另外,您是否使用过SQL Profiler?与@bubi关于记录SQL调用的观点类似,Profiler会准确地告诉您在数据库上调用了什么。