首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架: RowVersion值为空

实体框架: RowVersion值为空
EN

Stack Overflow用户
提问于 2018-09-24 09:22:00
回答 1查看 1.6K关注 0票数 2

我使用的是实体框架6.2.0和本地MSSQL (MDF)数据库。

我有几种类型都来自我的主类型"Entity“(使用了”每种类型的表“策略)。现在,我正在尝试实现乐观锁定。

在我的EDMX文件中,我向实体添加了一个属性RowVersion (一个固定长度的字节数组,在SQL:"RowVersion二进制(8)NULL“中),并将该proeprty的并发模式设置为”固定“。我用“时间戳”属性标记了实体类中的属性:

代码语言:javascript
复制
[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:

代码语言:javascript
复制
    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错误。这是我正在使用的单元测试:

代码语言:javascript
复制
    [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不是自动填写一个值,而是像处理其他字段一样处理字段。我在这里错过了什么?

EN

回答 1

Stack Overflow用户

发布于 2018-09-24 13:17:57

我想我误解了IsRowVersion/时间戳是一个数据库不可知论的东西。似乎只有在创建表时使用特定于MSSQL的数据库字段类型"rowversion“时,整个机制才能工作。所有其他数据库,如甲骨文、DB2等都不在范围之内。

由于我试图在我的项目中实现DBMS中立,我将不得不用"IsConcurrencyToken“手动实现这样一个特性。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52476169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档