我使用的是实体框架6.2.0和本地MSSQL (MDF)数据库。
我有几种类型都来自我的主类型"Entity“(使用了”每种类型的表“策略)。现在,我正在尝试实现乐观锁定。
在我的EDMX文件中,我向实体添加了一个属性RowVersion (一个固定长度的字节数组,在SQL:"RowVersion二进制(8)NULL“中),并将该proeprty的并发模式设置为”固定“。我用“时间戳”属性标记了实体类中的属性:
[System.ComponentModel.DataAnnotations.Schema.Table("EntitySet", Schema = "RightsManager")]
public partial class Entity
{
public int Id { get; set; }
public string Name { get; set; }
public System.DateTime ActiveFrom { get; set; }
public Nullable<System.DateTime> ActiveUntil { get; set; }
[System.ComponentModel.DataAnnotations.Timestamp]
public byte[] RowVersion { get; set; }
}我还将代码添加到DBContext后代的DBContext中,以指示要使用的RowVersion:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer<RightsManagerContext>(null);
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Entity>().Property(p => p.RowVersion).IsRowVersion();
modelBuilder.Entity<Product>().Property(p => p.RowVersion).IsRowVersion();
}问题:在插入新产品时,会引发SQL错误。这是我正在使用的单元测试:
[TestMethod]
public void TestCreateProduct()
{
using (var context = GetContext())
{
var newProduct = new Product
{
Name = "New product",
ActiveFrom = DateTime.Now
};
context.Entry(newProduct).State = System.Data.Entity.EntityState.Added;
var objectsWritten = context.SaveChanges();
Assert.AreNotEqual(0, objectsWritten);
};
}引发的最内部异常:
无法将值NULL插入列'RowVersion',表'P:\VISUAL STUDIO\PROJECTS\RIGHTSMANAGER\DATABASE\RIGHTSMANAGER.MDF.RightsManager.EntitySet';列不允许空。插入失败。
显然,EF不是自动填写一个值,而是像处理其他字段一样处理字段。我在这里错过了什么?
发布于 2018-09-24 13:17:57
我想我误解了IsRowVersion/时间戳是一个数据库不可知论的东西。似乎只有在创建表时使用特定于MSSQL的数据库字段类型"rowversion“时,整个机制才能工作。所有其他数据库,如甲骨文、DB2等都不在范围之内。
由于我试图在我的项目中实现DBMS中立,我将不得不用"IsConcurrencyToken“手动实现这样一个特性。
https://stackoverflow.com/questions/52476169
复制相似问题