.net 如何在使用TPT层次结构时首先在EF代码中实现并发性
大家好!我试图首先用实体框架代码实现乐观并发检查(通过nuget安装,所以我假设它是最后一个RC)。然而,我似乎无法让它工作。我有下面的类层次结构.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; }
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");
...
}