EF 4.1,代码优先:不属于“timestamp”或“rowversion”类型的属性不支持存储生成的模式“Computed”

Posted

技术标签:

【中文标题】EF 4.1,代码优先:不属于“timestamp”或“rowversion”类型的属性不支持存储生成的模式“Computed”【英文标题】:EF 4.1, Code First: The store generated pattern 'Computed' is not supported for properties that are not of type 'timestamp' or 'rowversion' 【发布时间】:2011-11-14 14:28:08 【问题描述】:

每个人。

我正在尝试在我的实体中添加乐观并发。实体类中定义了一个属性:

public byte[] ObjectVersion

    // ...

这里是这个属性的配置:

Property(obj => obj.ObjectVersion)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed)
    .HasColumnName("ObjectVersion")
    .IsConcurrencyToken();

在运行时抛出异常:“存储生成的模式 'Computed' 不支持类型为 'timestamp' 或 'rowversion' 的属性”。匹配的数据库列具有“rowversion”类型。

好的,我们来改一下配置代码:

    Property(obj => obj.ObjectVersion)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed)
    .HasColumnName("ObjectVersion")
    .HasColumnType("rowversion")
    .IsConcurrencyToken();

但是仍然抛出异常。 我做错了什么?

【问题讨论】:

这可能会澄清问题:social.msdn.microsoft.com/Forums/en-IE/adodotnetentityframework/… 我读过那个话题。它描述了一些不同的情况:1)任何自定义属性,配置为并发令牌; 2) Alan_chen 写道,ObjectContext.CreateDatabase 中的那个问题,我没有使用它。 @BrokenGlass:谢谢,你说的很对!我在查看堆栈跟踪时不专心。异常的原因是默认数据库初始化程序:我输入了错误的数据库名称,它试图创建数据库,所以,我从 MSDN 的 Ladislav 的主题中得到了一个情况。但是在默认策略的情况下,它是非常非常愚蠢 - 创建数据库!想象一下,该管理员正在连接到数据库服务器,并认为他正在连接到现有数据库。默认初始化程序创建数据库,然后所有连接的用户查看空数据表... crash 【参考方案1】:

documentation 显示了这两种配置并发令牌的方法:

modelBuilder.Entity<OfficeAssignment>()
    .Property(t => t.Timestamp)
    .IsConcurrencyToken();


modelBuilder.Entity<OfficeAssignment>()
    .Property(t => t.Timestamp)
    .IsRowVersion();  

【讨论】:

您的意思是我必须删除“.HasDatabaseGeneratedOption()”调用吗? “IsConcurrencyToken”选项是否足以让 DbContext 从存储中自动更新值? @Dennis,我不能肯定IsConcurrencyToken,但IsRowVersion 应该会自动更新。 仔细查看 IsConcurrencyToken 和 HasDatabaseGeneratedOption 表明它们必须结合起来才能正常工作。 “IsRowVersion”方法来自哪里? PrimitivePropertyConfiguration 类不包含它。 @Dennis,这是BinaryPropertyConfiguration 上的一个方法:msdn.microsoft.com/en-us/library/…

以上是关于EF 4.1,代码优先:不属于“timestamp”或“rowversion”类型的属性不支持存储生成的模式“Computed”的主要内容,如果未能解决你的问题,请参考以下文章

EF 4.1 代码优先关系表

EF 4.1 代码优先和成员资格

Windows窗体应用程序中的连接字符串EF 4.1代码优先SQL紧凑

MVC3 EF4.1 代码优先延迟加载

使用 EF 4.1 部署数据库更改

EF 4.1 模型中的图像数据类型优先