Entity Framework 4.1中的继承表问题

时间:2012-01-31 19:10:58

标签: c# .net entity-framework

我在实体框架4.1中遇到了一个问题,我似乎正在与圈子中进行讨论。我正在尝试创建一个简单的域,其中我有一个Case表,它与Question表有1..M的关系。然后我有一个继承表('Inherited Question'),它从Question表中共享Id。

我想要做的是将Question和InheritedQuestion类与它们链接的案例相关联,以便我可以做类似的事情:

var inheritedCase = context.Set<Case<InheritedQuestion>>.First();
InheritedQuestion inheritedQuestion = inheritedCase.Case.Questions.First();

这一切都可能吗?我相信EF对仿制药有所限制。我想知道我是否可以通过手动映射类属性来解决这个问题?

目前我无法通过EF实现这一目标。我在下面列出了我的问题的基础。我一直试图通过流畅的api实现这一点。

案例表
Id(PK)

问题表
CaseId(FK)
QuestionId(PK)
FIELD1

继承问题
QuestionId(FK)
字段2

这些是我的课程。

public class Case<T> where T : Question
{
  ICollection<T> Questions {get;set;}
}

public class Question
{
  string Field1 {get;set;}
  Case<Question> Case {get;set;}
}

public class InheritedQuestion : Question
{
  string Field2 {get;set;}
  new Case<InheritedQuestion> Case {get;set;}
}

1 个答案:

答案 0 :(得分:1)

这是不可能的。你必须使用它:

public class Case
{
  ICollection<Question> Questions {get;set;}
}

public class Question
{
  string Field1 {get;set;}
  Case Case {get;set;}
}

public class InheritedQuestion : Question
{
  string Field2 {get;set;}
}

现在,您的案例应该能够与问题和继承问题相关联。

如果您只需要单一类型的问题,以防创建两种案例类型或向您的应用程序添加自定义逻辑,这将验证该案例仅包含单一问题类型。

要支持多种案例类型,您可以尝试:

// Not mapped class!
public abstract BaseCase<T> where T : question
{
    ICollection<T> Questions { get; set; }
}

// Mapped entities
public Case : BaseCase<Question> { }
public Case2 : BaseCase<InheritedQuestion> { }