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

Visual studio 2010 具有继承、条件和外键的实体框架,visual-studio-2010,entity-framework,entity-framework-4,Visual Studio 2010,Entity Framework,Entity Framework 4,我刚开始玩Linq to实体,遇到了一个我无法解决的问题 我得到这个错误: 映射了条件不是“IsNull=False”的条件成员“RelatedResources.TypeID”。删除RelatedResources.TypeID上的条件或将其从映射中删除 存在的条件是抽象实体RelatedResource中定义RelatedResource类型(书籍、链接、指南等)的TypeID字段。TypeID也是一个外键,在与资源类型实体的关联中映射。我认为这就是问题所在,但我不知道应该如何或为什么更改它

我刚开始玩Linq to实体,遇到了一个我无法解决的问题

我得到这个错误:

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


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

相关资源。数据库和entityframework架构中的TypeID
设置为不为null(即'Isnull=false')

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


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

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

听起来像是逐层次表(TPH)继承错误:

在基类属性上使用
[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));
    }
}
公共抽象类MyBaseClass
{ 
[未映射]
public MyEnum MyEnum{get;protected set;}
}
公共类DerivedOne:MyBaseClass
{
公共衍生电话()
{
MyEnum=MyEnum.Value1;
}
公共字符串MyDerivedOneString{get;set;}
}
公共类派生二:MyBaseClass
{
公之于众
{
MyEnum=MyEnum.Value2;
}
}
公共类MyDbContext:DbContext
{
DbSet MyBaseClass{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity()
.Map(x=>x.Requires(“MyEnum”).HasValue((int)MyEnum.Value1))
.Map(x=>x.Requires(“MyEnum”).HasValue((int)MyEnum.Value2));
}
}

我就是这么想的,但我不知道如何解决这个问题。您是否试图使用ResourceType实体/表来确定相关资源的类型?也就是说,如果ResourceType.Name==“Book”,那么相关资源的实际类型是Book?如果是这样的话,您的混合继承和包含(不幸的是,实体框架不喜欢)。从OOP的角度来看,名称/图标属性实际上应该在继承的类中(即Book应该定义自己的名称和图标,而不是其他类型)。。。说得好。我会玩一会儿。谢谢。经过一段时间的实验,我认为最好的方法就是放弃继承。我不想这样做,但我看不到解决的办法。如果你有任何想法,请让我知道。。。我真正想做的是将resourceType实体与RelatedResource实体结合起来,以解决所有问题,包括您提到的oop设计。但我不知道如何解决:(到目前为止,只有两种可能的解决方案似乎是放弃您所说的继承或放弃关联(从而放弃FK关系)。这两个解决方案都不是最优的。对于数据库中ResourceTypes和RelatedResources之间的关系。我开始悬赏,因为标记为该问题答案的答案不完整,并且因为互联网上到处都有该问题的示例。基本上,这与使用For有关基本实体中的eign键,作为从该基础继承的实体之间的区别。这里它表示我们要做的只是不使用EF: