当我尝试保存数据库更改时,我一直收到此错误:
> {"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();
在加载后没有其他代码可以修改我的条目,所以这个异常毫无意义。我项目中唯一的文件是上面发布的文件。
有谁知道为什么会发生这种情况以及我该如何解决?
代码段非常有用。
感谢。
答案 0 :(得分:1)
通过编辑数据表以使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;
一切都按预期工作。现在,如果有人能够解释为什么这个误导性的异常应该因为缺少主键而引发,那么它会给我一些封闭......
感谢。
答案 1 :(得分:0)
double(2,0)没有任何意义。这是一个精确到2位的浮点数,没有小数。它基本上是一个编码错误的字节。重构为十进制(5,2)可能适合这里。
它可能使用主键,因为它使用主键来查找要更新的记录,而不是所有旧值的组合。你使用double(2,0)会导致精度没有正确地往返的问题。
就像你试图在数据库中存储152.999999999一样,当检索到它时,它会四舍五入为153.然后当你尝试更新时,它会请求更新高度为153的记录,然后数据库就可以了找不到。
这种类型的问题对于不精确的类型(不是浮点数)以及MySql并不常见,因为它在执行您指定的数据类型方面做得非常糟糕 - 通常即使类型不正确,只要将你提供的内容推到数据库中即可。但是当你在一个实际上尊重类型的应用程序中使用它时,会丢失一些精度并且它与MySql的值不同。