Pax*_*xxi 14 .net c# entity-framework
我正在尝试学习如何使用实体框架,但我遇到了一个我无法解决的问题.我正在做的是,我正在浏览我拥有的电影列表,并将每个电影插入一个简单的数据库.
这是我正在使用的代码
private void AddMovies(DirectoryInfo dir)
{
MovieEntities db = new MovieEntities();
foreach (DirectoryInfo d in dir.GetDirectories())
{
Movie m = new Movie { Name = d.Name, Path = dir.FullName };
db.AddToMovies(movie);
}
db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我在db.SaveChanges()读取了一个异常.
已成功提交对数据库的更改,但更新对象上下文时发生错误.ObjectContext可能处于不一致状态.内部异常消息:AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突.在调用AcceptChanges之前,请确保键值是唯一的.
我无法找出造成这个问题的原因.我的数据库表包含三列
Id int autoincrement
Name nchar(255)
Path nchar(255)
更新:我检查了我的edmx文件,SSDL部分按照建议使用StoreGeneratedPattern ="Identity".我也跟着博客文章,试图在CSDL中添加ClientAutoGenerated ="true"和StoreGenerated ="true".这导致编译错误(错误5:不允许'ClientAutoGenerated'属性.).由于博客文章是从2006年开始的,并且它有一个后续帖子的链接,我认为它已被更改.
但是,我无法阅读后续帖子,因为它似乎需要一个msdn帐户.
Pax*_*xxi 10
我找到了解决方案.
发生的事情是,当我创建我的表时,我忘了添加主键并将(Is Identity)属性设置为yes.然后我创建了我的实体模型并得到了这个错误.
我回去修复了我的数据库表,但我仍然讨厌奇怪的异常.最终解决问题的方法是删除实体并在修复表后重新创建它.
没有更多例外:)
小智 7
上次我尝试下面的代码,我说它工作正常
bs.SuspendBinding();
Data.SaveChanges();
bs.ResumeBinding();
Run Code Online (Sandbox Code Playgroud)
我今天告诉你的重要事情是:
1-如果我们使用上面的代码暂停绑定,我们必须做更多的代码来修复很多场景,比如集合中丢失的索引和主细节绑定
2-如果我们使用以下代码而不是上面的代码,我们将看到异常消失,并且每个东西都可以,无需编写更多代码
Data.SaveChanges(System.Data.Objects.SaveOptions.None);
Run Code Online (Sandbox Code Playgroud)
我希望这能解决你的类似问题
谢谢你的朋友们
此异常似乎告诉您在Id列中的几行中具有相等的值,该列应该只具有唯一值,因为它是一个键列.实体框架可以通过两种方式处理此类列:您(客户端)生成唯一值,或者服务器生成唯一值.在您的情况下,允许服务器生成自动增量密钥似乎是合乎逻辑的.
您是否StoreGeneratedPattern在SSDL文件中为Id列设置了密钥?
以下是此博客文章中的一个示例:
<EntityType Name="rooms" Key="id">
<Property Name="id" Type="int" Nullable="false"
StoreGeneratedPattern="Identity" />
<Property Name="name" Type="nvarchar" Nullable="false" MaxLength="50" />
</EntityType>
Run Code Online (Sandbox Code Playgroud)