gpt4 book ai didi

c# - 如何处理 EF 4.3.1 设置修改了 Rowversion 行

转载 作者:太空狗 更新时间:2023-10-29 23:01:31 25 4
gpt4 key购买 nike

假设我们有:

public class Driver
{
public int driverID { get; set; }
public byte[] stamp { get; set; }
public string name { get; set; }
public string prename { get; set; }
}

现在简而言之,我面临着这种情况。

 ...
var myDriver = myCustomDBContext.Drivers.AsNoTracking()
.Where(d => d.driverID == driverID)
.SingleOrDefault();
...
myDriver.name = "John";
myDriver.prename = "Lennon";
...
myCustomDBContext.Drivers.Attach(myDriver);
myCustomDBContext.Entry(myDriver).State = EntityState.Modified;
myCustomDBContext.SaveChanges();
...

结果是

 The column cannot be modified because it is an identity, rowversion or 
a system column. [Column name = stamp]

是否有任何方法可以强制对分离的实体进行更新,或者是否有解决此 rowversion 列不被设置为已修改的方法。

最佳答案

您似乎没有在模型中将 stamp 属性指定为行版本,它只是一个二进制字段。您可以使用 Fluent API 指定它:

modelBuilder.Entity<Driver>().Property(d => d.stamp)
.IsRowVersion()
.IsConcurrencyToken(false);

上面的代码适用于您不想将 stamp 属性作为并发标记的情况。 (默认情况下,rowversion 是并发 token ,因此您必须明确禁用它。)如果您想将其作为并发 token ,则可以使用 Fluent API...

modelBuilder.Entity<Driver>().Property(d => d.stamp)
.IsRowVersion();

...或带有数据注释:

[Timestamp]
public byte[] stamp { get; set; }

这应该会阻止 EF 为该属性写入更新。

编辑

如果您使用数据库优先策略,则 [Timestamp] 属性不起作用。此属性仅适用于代码优先开发。

当您使用数据库优先时,连接字符串包含引用 EDMX 文件中定义的 EDM 的元数据部分:

connectionString="metadata=res://*/Model1.csdl
|res://*/Model1.ssdl
|res://*/Model1.msl;
...
..."

如果 Entity Framework 在连接字符串中找到此部分,它不会在模型属性上使用数据注释,也不会处理 Fluent API 中的任何代码(根本不会调用 OnModelCreating)。相反,它从嵌入和编译的 EDMX 文件加载映射定义。

这意味着,如果您想将 stamp 属性定义为并发标记,您必须在 EDMX 文件中执行此操作。在 XML 中,它看起来像这样:

在 SSDL 部分:

<Property Name="stamp" Type="timestamp" Nullable="false"
StoreGeneratedPattern="Computed" />

在 CSDL 部分:

<Property Name="stamp" Type="Binary" Nullable="false" MaxLength="8"
FixedLength="true"
annotation:StoreGeneratedPattern="Computed"
ConcurrencyMode="Fixed" />

您还可以在 Visual Studio 的模型设计器中定义它:在设计器界面的实体中标记 stamp 属性,转到属性窗口并将“并发模式”设置为“固定” (并将“StoreGeneratedPattern”设置为“Computed”)。

您还可以从连接字符串中删除元数据部分。但这实际上意味着您从数据库优先切换到代码优先开发。然后所有属性和 Fluent API 都将得到尊重,但不再是 EDMX 中的任何定义。

关于c# - 如何处理 EF 4.3.1 设置修改了 Rowversion 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10353589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com