【问题标题】:Entity framework with inheritance, condition, and foreign key具有继承、条件和外键的实体框架
【发布时间】:2017-07-02 05:43:54
【问题描述】:

我刚开始使用 Linq to entity 并遇到了一个我无法弄清楚的问题。

我收到此错误:

条件成员“RelatedResources.TypeID”的条件不是“IsNull=False”被映射。删除 RelatedResources.TypeID 上的条件或将其从映射中删除。

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

【问题讨论】:

  • 关于数据库中ResourceTypes和RelatedResources的关系。
  • 我正在为此开始赏金,因为被标记为该问题答案的答案的答案不完整,并且因为整个互联网上都有这个问题的例子。基本上,它与在基实体中使用外键作为从该基继承的实体之间的区分符有关。
  • 这里说我们想要做的只是对 EF 的拒绝:forums.oreilly.com/content/Programming-Entity-Framework/4735/…

标签: visual-studio-2010 entity-framework entity-framework-4


【解决方案1】:

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

【讨论】:

  • 这就是我的想法,但我不知道解决办法。
  • 您是否尝试使用 ResourceType 实体/表来确定 RelatedResource 的类型? IE。如果 ResourceType.Name == "Book" 那么 RelatedResource 的实际类型是 Book?如果是这种情况,您将继承与包含混合(不幸的是,哪个实体框架不喜欢)。从 OOP 的角度来看,Name/Icon 属性实际上应该在继承的类中(即 Book 应该定义自己的名称和图标,而不是其他类型)
  • 正是...好点。我会玩一会儿。谢谢。
  • 经过大量试验后,我认为处理此问题的最佳方法是放弃继承。我讨厌这样做,但我看不到绕过它的方法。如果您有任何想法,请告诉我...我真正想做的是将 resourceType 实体与 RelatedResource 实体结合起来,以解决包括您提到的 oop 设计在内的所有问题。但我不知道怎么做:(
  • 到目前为止,只有两种可能的解决方案似乎放弃了您所说的继承或放弃关联(从而放弃了 FK 关系)。这两种解决方案都不是最优的。
【解决方案2】:

RelatedResources.TypeID 在数据库和实体框架架构中是否设置为非空(即“Isnull=false”)?

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

如果你使用条件继承来确定类型,你需要吗?

【讨论】:

    【解决方案3】:

    听起来像每层级表 (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));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多