mysql - 如何使用 MySql 解决 EntityFramework 的 DbUpdateConcurrencyException

标签 mysql entity-framework

当我尝试保存数据库更改时,我不断收到此错误:

> {"Store update, insert, or delete statement affected an unexpected
> number of rows (0). Entities may have been modified or deleted since
> entities were loaded. See
> http://go.microsoft.com/fwlink/?LinkId=472540 for information on
> understanding and handling optimistic concurrency exceptions."}

主程序例程为:

class Program
{
    static void Main( string[] args )
    {
        var ctx = new SchoolContext();

        Student stud = new Student();
        stud.StudentID = 0;
        stud.Height = 0.2;
        stud.StudentName = "New Student";

        ctx.Students.Add(stud);

        ctx.SaveChanges();
    }
}

DbContext 是:

public class SchoolContext : DbContext
{
    public SchoolContext()  : base("name=SchoolContext")
    {
    }

    public virtual DbSet<Student> Students { get; set; }
}

模型是:

public class Student
{
    public Student()
    {
    }

    public int StudentID { get;set; }
    public string StudentName { get;set; }
    public double Height { get;set; }
}

我的app.config是:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
    <entityFramework>
        <defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" />
        <providers>
            <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
        </providers>
    </entityFramework>
    <connectionStrings>
        <add name="SchoolContext" providerName="MySql.Data.MySqlClient" connectionString="server=localhost;port=3306;database=test;uid=root;password=tree"/>
    </connectionStrings>
</configuration>

我的packages.config文件是:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="6.1.3" targetFramework="net40" />
</packages>

我的数据库表定义为:

DROP TABLE IF EXISTS `students`;
CREATE TABLE `students` (
  `Height` double(10,5) DEFAULT NULL,
  `StudentId` int(2) DEFAULT NULL,
  `StudentName` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

异常发生在主程序中的以下行:ctx.SaveChanges();

加载后没有任何其他代码可以修改我的条目,因此此异常没有意义。我的项目中唯一的文件是上面发布的文件。

有谁知道为什么会发生这种情况以及我应该如何解决它?

代码片段会非常有帮助。

谢谢。

最佳答案

通过编辑数据表使 SutdentID 主键解决了 DbUpdateConcurrencyException:

DROP TABLE IF EXISTS `students`;
CREATE TABLE `students` (
  `Height` double(10,5) DEFAULT NULL,
  `StudentId` int(2) NOT NULL,
  `StudentName` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`StudentId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

一切都按预期进行。现在,如果有人可以解释为什么由于缺少主键而应该引发这个误导性异常,这会给我一些结论......

谢谢。

关于mysql - 如何使用 MySql 解决 EntityFramework 的 DbUpdateConcurrencyException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31572897/

相关文章:

c# - 使用 LINQ to SQL 左连接

mysql - 如何通过比较更新mysql cols

php - MyISAM 引擎表关系 (MySQL)

java - JPA 删除 MySql 触发器

php - 我如何执行作为字符串存储在数据库中的php代码

c# - Entity Framework - 添加现有数据库

c# - EF6 ToListAsync() 取消长查询不起作用

c# - Entity Framework 存储过程 - 映射复杂属性

mysql - Entity Framework (MySQL) - 使用两个 dbcontext 将数据从一个数据库移动到另一个数据库

MySQL WHERE 不是非常慢