Entity framework EF5,继承的FK和基数

Entity framework EF5,继承的FK和基数,entity-framework,cardinality,Entity Framework,Cardinality,我有这样的班级结构: 公共课堂活动 { [Key] 公共长活动ID{get;set;} 公共字符串ActivityName{get;set;} 公共虚拟哈希集ActivityLogMessages{get;set;} 公共虚拟哈希集FileImportLogMessages{get;set;} 公共虚拟哈希集RowImportLogMessages{get;set;} } 公共抽象类日志消息 { [必需] 公共字符串消息{get;set;} 公共DateTimeOffset CreateDate

我有这样的班级结构:

公共课堂活动 {

[Key]
公共长活动ID{get;set;}
公共字符串ActivityName{get;set;}
公共虚拟哈希集ActivityLogMessages{get;set;}
公共虚拟哈希集FileImportLogMessages{get;set;}
公共虚拟哈希集RowImportLogMessages{get;set;}
}
公共抽象类日志消息
{
[必需]
公共字符串消息{get;set;}
公共DateTimeOffset CreateDate{get;set;}
[必需]
公共长活动ID{get;set;}
公共虚拟活动活动{get;set;}
}
公共类活动LogMessage:LogMessage
{
公共长活动LogMessageId{get;set;}
}
公共类FileImportLogMessage:ActivityLogMessage
{
公共long?stagefleid{get;set;}
}
公共类RowImportLogMessage:FileImportLogMessage
{
公共long?StageFileRowId{get;set;}
}
这给了我这个,模型

每个消息(活动、文件或行)必须与活动关联。为什么第二级和第三级与ActivityLogMessage的基数不同?我试图描述外键关系(通过modelbuilder流畅)的尝试也失败了

这对我来说是一个真正理解EF如何映射到关系的学术练习,这让我很困惑

问候,,
Richard

EF推断出一对导航属性
Activity.ActivityLogMessages
ActivityLogMessage.Activity
,其外键属性
ActivityLogMessage.ActivityId
不可为空,因此根据需要定义关系

其他两个关系是从集合
Activity.FileImportLogMessages
Activity.RowImportLogMessages
推断出来的。它们在另一侧既没有反向导航属性,也没有外键属性,默认情况下,外键属性将导致可选关系

您可能希望
LogMessage.Activity
LogMessage.ActivityId
被用作所有三个集合的反向属性。但它不是这样工作的。EF不能在多个关系中使用相同的导航属性。此外,您当前的模型意味着,例如,
RowImportLogMessage
活动
有三种关系,而不仅仅是一种关系

我相信,如果您删除这些收藏,您将更接近您想要的:

public virtual HashSet<FileImportLogMessage> FileImportLogMessages { get; set; }
public virtual HashSet<RowImportLogMessage> RowImportLogMessages { get; set; }
public virtual HashSet<FileImportLogMessage> FileImportLogMessages { get; set; }
public virtual HashSet<RowImportLogMessage> RowImportLogMessages { get; set; }
var fileImportLogMessages = ActivityLogMessages.OfType<FileImportLogMessage>();
// fileImportLogMessages will also contain entities of type RowImportLogMessage

var rowImportLogMessage = ActivityLogMessages.OfType<RowImportLogMessage>();