使用SQL Compact 4的EF4,rowversion在保存时不会更新

时间:2011-07-11 18:17:29

标签: c# entity-framework-4 timestamp sql-server-ce rowversion

我有一个使用SQL Compact 4.0和实体框架的简单控制台应用程序4.数据库有一个名为Section的表,它有三列:Id (StoreGeneratedPattern:Identity,Type: Int32)Title (类型:字符串)TimeStamp (StoreGeneratedPattern:Computed,ConcurrencyMode:Fixed,Type:Binary,MaxLength: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中的错误还是我错过了什么?

谢谢,

的Darren

3 个答案:

答案 0 :(得分:0)

也许: context.Refresh(System.Data.Objects.RefreshMode.ClientWins,section); 在第一次SaveChanges之后

答案 1 :(得分:0)

我发现了问题。事实证明,这是edmx设计器中的一个错误,其中StoreGeneratedPattern的属性未写入底层xml文件。它仅保存在CSDL部分中,但不保存在SSDL部分中请参阅http://www.ladislavmrnka.com/2011/03/the-bug-in-storegeneratedpattern-fixed-in-vs-2010-sp1/请注意,在该博客中他说它已在VS2010 SP1中修复,我有那个版本,并且它没有在我的版本中修复!

手动输入xml文件修复了问题。不幸的是,随后的变化再次清除它。

的Darren

答案 2 :(得分:-1)

听起来像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一个人说了一切:

  

词汇,   您正在讨论的4.1.1已知问题仅在您尝试对具有Identity或Rowversion列的表执行DML操作时才会出现问题。就选择语句而言,没有问题,一切都应该有效。如果您需要在应用程序中针对SQLCE使用DML语句,则不应在模式中使用Identity和Rowerversion列。休息一切都会正常工作,Entity Framework将为您添加数据。如果您在此之后仍然遇到任何问题,请告诉我,我将很乐意为您提供帮助。关心Ravi Tandon。

这是对帖子评论的某个地方。 DML代表数据操作语言(读取:插入/更新/删除)。