我在实体框架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;}
}
答案 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> { }