为非可空成员

时间:2017-03-20 13:37:21

标签: c# entity-framework

我有一个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);
}
}

0 个答案:

没有答案