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”的主要内容,如果未能解决你的问题,请参考以下文章