.net 如何在使用TPT层次结构时首先在EF代码中实现并发性

.net 如何在使用TPT层次结构时首先在EF代码中实现并发性,.net,inheritance,sql-server-ce,ef-code-first,entity-framework-4.1,.net,Inheritance,Sql Server Ce,Ef Code First,Entity Framework 4.1,大家好!我试图首先用实体框架代码实现乐观并发检查(通过nuget安装,所以我假设它是最后一个RC)。然而,我似乎无法让它工作。我有下面的类层次结构 public abstract class DbEntityBase { /// <summary> /// Autogenerated primary key for the object /// </summary> public Guid Id { get; private set; }

大家好!我试图首先用实体框架代码实现乐观并发检查(通过nuget安装,所以我假设它是最后一个RC)。然而,我似乎无法让它工作。我有下面的类层次结构

public abstract class DbEntityBase
{
    /// <summary>
    /// Autogenerated primary key for the object
    /// </summary>
    public Guid Id { get; private set; }

    protected DbEntityBase()
    {
        Id = Guid.NewGuid();
    }

    //Some override for equality, omitted for brievity
}

public class Drawing : DbEntityBase
{
    public string Name { get; set; }

    //Just an implementation of ICollection<DrawingVersion>
    public DrawingVersionCollection Versions { get; private set; }

    public Drawing()
    {
        Name = "New Drawing";
        Versions = new DrawingVersionCollection(this);         
    }

}

public class DrawingVersion : DbEntityBase
{
    public string Name { get; set; }

    public DateTime Started { get; set; }

    public DateTime LastModified { get; set; }

    public DrawingFile File { get; private set; }

    public Drawing Owner { get; internal set; }

    internal DrawingVersion()
    {
        Name = "New Version";
        Started = DateTime.Now;
        LastModified = DateTime.Now;
        File = new DrawingFile();
    }
}
在我的上下文中,这些行

        //Versionning mapping
        modelBuilder.Entity<DbEntityBase>()
            .Property(e => e.Timestamp)
            .IsConcurrencyToken()
            .HasColumnType("timestamp")
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
//版本映射
modelBuilder.Entity()
.Property(e=>e.Timestamp)
.IsConcurrencyToken()
.HasColumnType(“时间戳”)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
但是,在模式生成过程中,它会失败,出现以下异常

System.NotSupportedException: 存储生成的模式“计算”为 不支持以下属性: 不是“时间戳”类型或 “rowversion”

那时我有点神经质。“好吧,天哪,这对我来说就是这样,在列类型中添加timestamp,而我应该添加timestamp”。我试着换成“rowversion”,但还是没用。我还直接在属性上尝试了TimestampAttribute,但出现了相同的错误

我试图将时间戳数据放在子类上,但随后遇到了以下异常

System.Data.Entity.ModelConfiguration.ModelValidationException :出现一个或多个验证错误 在模型生成过程中检测到

System.Data.Edm.EdmEntityType::Type “Portfolio.Repositories.Drawing”是 派生自类型 '公文包.Repositories.DbEntityBase' 这是EntitySet的类型 “PortfolioContext.dbEntityBase”。类型 '公文包.存储库.绘图' 定义新的并发性需求 不允许用于子类型的 基本EntitySet类型

所以我想我也不能这么做

我必须说,我很困惑。为什么异常告诉我应该使用时间戳,因为这正是我正在做的事情?这可能是框架中的一个bug吗?如果否,是否有其他方法可以通过表PerType映射添加并发检查


我正在使用SQL Server Ce 4.0作为我的数据库。

这似乎是定义TPC继承时的一个问题。必须修改子实体映射才能使用来自父实体的映射:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    ...

    modelBuilder.Entity<DrawingVersion>()
                .Map(m => m.MapInheritedProperties())
                .ToTable("DrawingVersion");

    modelBuilder.Entity<Drawing>()
                .Map(m => m.MapInheritedProperties())
                .ToTable("Drawing");

    ...
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
...
modelBuilder.Entity()
.Map(m=>m.MapInheritedProperties())
.ToTable(“绘图版本”);
modelBuilder.Entity()
.Map(m=>m.MapInheritedProperties())
.ToTable(“图纸”);
...
}

这似乎是定义TPC继承时的一个问题。必须修改子实体映射才能使用来自父实体的映射:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    ...

    modelBuilder.Entity<DrawingVersion>()
                .Map(m => m.MapInheritedProperties())
                .ToTable("DrawingVersion");

    modelBuilder.Entity<Drawing>()
                .Map(m => m.MapInheritedProperties())
                .ToTable("Drawing");

    ...
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
...
modelBuilder.Entity()
.Map(m=>m.MapInheritedProperties())
.ToTable(“绘图版本”);
modelBuilder.Entity()
.Map(m=>m.MapInheritedProperties())
.ToTable(“图纸”);
...
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    ...

    modelBuilder.Entity<DrawingVersion>()
                .Map(m => m.MapInheritedProperties())
                .ToTable("DrawingVersion");

    modelBuilder.Entity<Drawing>()
                .Map(m => m.MapInheritedProperties())
                .ToTable("Drawing");

    ...
}