我有一个EF 6 Code First模型,其属性DatabaseGenerated(DatabaseGeneratedOption.Identity)
不是主键,并且在尝试插入时我得到“null store-generated value”。为什么会这样?完整的例外是:
为不可为空的成员返回了null存储生成的值 'RandomColumnWithAnIdentity'的类型 'MyCompany.MyDataLayer.Entities.TheChildTable'。
因此,该列不是主键,但标记为DatabaseGeneratedOption.Identity,这是错误的。这是否支持EF?
实体(这是外键关系中的孩子):
[Table("TheChildTable")]
public class TheChildTable : TheBaseType
{
public Guid TheChildTableId { get; set; }
public Guid TheParentTableId { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int RandomColumnWithAnIdentity { get; set; }
[Required]
[StringLength(100)]
public string Param { get; set; }
[Required]
public string Value { get; set; }
public virtual TheParentTable TheParentTable { get; set; }
}
父级的映射(子级没有映射):
modelBuilder.Entity<TheParentTable>()
.HasMany(e => e.TheChildTables)
.WithRequired(e => e.TheParentTable)
.WillCascadeOnDelete(false);
更新1:以下是父类型和基本类型的附加代码。
这是 TheParentTable 。有趣的是,它还有一个Identity列,但是这个列正在运行:
[Table("TheParentTable")]
public class TheParentTable : TheBaseType
{
public TheParentTable()
{
this.TheChildTables = new HashSet<TheChildTable>();
}
public Guid TheParentTableId { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int RandomColumnWithAnIdentity { get; set; }
public virtual ICollection<TheChildTable> TheChildTables { get; set; }
}
这是 TheBaseType :
public abstract class TheBaseType : IAuditable
{
public DateTime? Created { get; set; }
public Guid? CreatedBy { get; set; }
public DateTime? Deleted { get; set; }
public Guid? DeletedBy { get; set; }
public bool IsDeleted { get; set; }
public DateTime? Updated { get; set; }
public Guid? UpdatedBy { get; set; }
}
以下是DbContext实现的摘录:
public class MyDbContext : DbContext
{
public virtual DbSet<TheParentTable> TheParentTables { get; set; }
public virtual DbSet<TheChildTable> TheChildTables { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
#if DEBUG
this.Database.Log = s => Debug.Write(s);
#endif
this.Configuration.LazyLoadingEnabled = false;
modelBuilder.Entity<TheParentTable>()
.HasMany(e => e.TheChildTables)
.WithRequired(e => e.TheParentTable)
.WillCascadeOnDelete(false);
base.OnModelCreating(modelBuilder);
}
}