代码之家  ›  专栏  ›  技术社区  ›  Mike Florian Doyen

具有继承、条件和外键的实体框架

  •  11
  • Mike Florian Doyen  · 技术社区  · 15 年前

    我刚开始和LinqToEntities打交道,遇到了一个我无法解决的问题。

    我得到这个错误:

    已映射条件成员“relatedresources.typeid”和条件“isNull=false”之外的条件。要么删除relatedresources.typeid上的条件,要么将其从映射中删除。

    存在的条件是抽象实体相关资源中的typeid字段,它定义相关资源的类型(书籍、链接、指南等)。typeid也是一个外键,并在与资源类型实体的关联中映射。我认为这是个问题,但我不知道该如何或为什么要改变它。

    3 回复  |  直到 7 年前
        1
  •  9
  •   NotDan    15 年前

    当您将typeid作为条件并将其用作属性时,通常会发生这种情况。它可能会导致问题,因为您使用它来映射与ResourceType的关联,并将其用作继承的条件。

        2
  •  0
  •   Hath    15 年前

    RelatedResources.TypeID 在数据库和EntityFramework架构中设置为非空(即“isNull=false”)?

    不确定是否可以将该字段作为条件字段,并作为另一个表的外键。

    如果使用条件继承来确定类型,您是否需要这样做?

        3
  •  0
  •   Ogglas    7 年前

    听起来像每个层次结构的表(TPH)继承错误:

    https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application

    使用 [NotMapped] 在基类属性上。

    伪代码:

    public abstract class MyBaseClass
    { 
        [NotMapped]
        public MyEnum MyEnum { get; protected set; }
    }
    
    
    public class DerivedOne: MyBaseClass
    {
        public DerivedOne()
        {
            MyEnum = MyEnum.Value1;
        }
    
        public string MyDerivedOneString { get; set; }
    }
    
    public class DerivedTwo: MyBaseClass
    {
        public DerivedTwo()
        {
            MyEnum = MyEnum.Value2;
        }
    }
    
    public class MyDbContext : DbContext
    {
        DbSet<MyBaseClass> MyBaseClass { get; set; }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
    
            modelBuilder.Entity<MyBaseClass>()
                .Map<DerivedOne>(x => x.Requires("MyEnum").HasValue((int)MyEnum.Value1))
                .Map<DerivedTwo>(x => x.Requires("MyEnum").HasValue((int)MyEnum.Value2));
        }
    }