实体框架4(CTP 5)并发

GtE*_*tEx 2 linq entity-framework code-first linq-to-sql entity-framework-4

自从我读到Code-First以来,我发现这可能存在问题(尽管只是预览)我对EF4 CTP5的发布存在以下问题:

正如它所说的"新变化跟踪API"但它不能跟踪变化我猜.与LINQ to SQL相比,我举了一个例子来看看每个方法的反应:

LINQ to SQL:

Dim db2 As New LINQDataContext
Dim db3 As New LINQDataContext

db2.Product.FirstOrDefault(Function(m) m.ID = 100).Name = "Change1"
db3.Product.FirstOrDefault(Function(m) m.ID = 100).Name = "Change2"

db2.SubmitChanges()
db3.SubmitChanges()
Run Code Online (Sandbox Code Playgroud)

EF 4 CTP5:

Dim db2 As New ProductContext
Dim db3 As New ProductContext

db2.Product.FirstOrDefault(Function(m) m.ID = 100).Name = "Change1"
db3.Product.FirstOrDefault(Function(m) m.ID = 100).Name = "Change2"

db2.SaveChanges()
db3.SaveChanges()  
Run Code Online (Sandbox Code Playgroud)

这些代码仅在其上下文中有所不同.在LINQ to SQL中,第二个SubmitChanges会出现"未找到或未更改行"的异常.,但在EF中它会忽略这些变化并继续两次更改行,我认为这很糟糕,因为我们必须考虑并发,对吧?

Jul*_*man 9

专注于您的第一次比较,我相信您在LINQ to SQL中默认有一些乐观的并发检查.在EF中,您必须显式标记要检查并发性的任何属性.由于您很可能没有为Name属性执行此操作,因此EF并不关心有人在另一个数据库命令中更改了产品名称.

我还想指出,这不是特定的代码优先行为,但它是整个EF的行为.如果创建实体数据模型,则还必须明确标记并发检查的属性.

如果您使用的是流畅的API,请查找IsConcurrencyToken作为要在属性上设置的属性.如果您正在使用注释,请查看ConcurrencyCheckAttribute.

朱莉