EF4 与 SQL Compact 4,rowversion 在保存时不更新
Posted
技术标签:
【中文标题】EF4 与 SQL Compact 4,rowversion 在保存时不更新【英文标题】:EF4 with SQL Compact 4, rowversion doesn't update on save 【发布时间】:2011-07-11 18:17:28 【问题描述】:我有一个使用 SQL Compact 4.0 和实体框架 4 的简单控制台应用程序。数据库有一个名为 Section
的表,其中包含三列:Id
(StoreGeneratedPattern: Identity, Type: Int32) em>、Title
(类型:字符串) 和 TimeStamp
(StoreGeneratedPattern:计算,并发模式:固定,类型:二进制,最大长度:8)。 TimeStamp 列实际上是 SQL Compact 中的 rowversion 类型。
我在 main 中有以下代码:
Section section = new Section();
section.Title = "Hello";
using (Entities1 context = new Entities1())
context.Sections.AddObject(section);
context.SaveChanges();
section.Title = "Changed";
context.SaveChanges();
此代码引发并发异常,因为在第一个 SaveChanges() 方法之后未从数据库更新 TimeStamp 列。请注意,它在 SQLServer2008 中运行良好。
这是 Compact 中的错误还是我遗漏了什么?
谢谢,
达伦
【问题讨论】:
【参考方案1】:也许: context.Refresh(System.Data.Objects.RefreshMode.ClientWins, section); 在第一次 SaveChanges 之后
【讨论】:
【参考方案2】:我发现了问题。原来这是 edmx 设计器中的一个错误,其中 StoreGeneratedPattern 的属性未写入基础 xml 文件。它仅保存在 CSDL 部分中,但不保存在 SSDL 部分中 请参阅http://www.ladislavmrnka.com/2011/03/the-bug-in-storegeneratedpattern-fixed-in-vs-2010-sp1/ 请注意,在该博客中他说它已在 VS2010 SP1 中修复,我有那个版本,但在我的中没有修复!
手动将其输入到 xml 文件中解决了问题。不幸的是,随后的更改再次清除了它。
达伦
【讨论】:
【参考方案3】:听起来像是 EF 中不支持的功能与 SQL CE 结合使用。也许这会提供更多的见解:
EF / SQL CE / Auto-generated primary keys
Rowversion column cannot be updated in SQL CE - maybe this conflicts with EF trying to update it when you SaveChanges
但是this 说明了一切:
词汇, 只有当您尝试对具有 Identity 或 Rowversion 列的表执行 DML 操作时,您正在谈论的 4.1.1 已知问题才会导致问题。在选择语句方面没有问题,一切都应该工作。如果您需要在应用程序中针对 SQLCE 使用 DML 语句,则架构中不应包含 Identity 和 Rowerversion 列。休息一切都会正常工作,Entity Framework 将为您添加数据。如果您在此之后仍然遇到任何问题,请告诉我,我很乐意提供帮助。问候 Ravi Tandon。
它位于帖子上的 cmets 下方。 DML 代表数据操作语言(阅读:插入/更新/删除)。
【讨论】:
自动生成的keys问题是3.5的问题,4.0已经修复了以上是关于EF4 与 SQL Compact 4,rowversion 在保存时不更新的主要内容,如果未能解决你的问题,请参考以下文章
使用 SQL Compact/EF4 的 GUID 或 int 实体键?
将 SQL Server Compact 4.0.0.1 与 Entity Framework 4.3 一起使用
无法让 sql server compact 3.5 / 4 与 ASP .NET MVC 2 一起使用
SQL Compact 4.0 和 Entity Framework 4.0:图像/Blob 限制?