C# 实体框架6-代码优先-FK在继承类中生成,但关系在基类中定义

C# 实体框架6-代码优先-FK在继承类中生成,但关系在基类中定义,c#,entity-framework,inheritance,foreign-keys,entity-framework-6,C#,Entity Framework,Inheritance,Foreign Keys,Entity Framework 6,我想要的是有一个基类和两个单独的继承类列表。 这是我的模型: 公共类实例 { public int InstanceId{get;set;} 公共虚拟ICollection用户{get;internal set;} 公共虚拟ICollection主用户{get;internal set;} } 公共抽象类CoreUser { [关键] public int UserId{get;set;} public int InstanceId{get;set;} 公共虚拟实例实例{get;set;}

我想要的是有一个基类和两个单独的继承类列表。 这是我的模型:

公共类实例
{
public int InstanceId{get;set;}
公共虚拟ICollection用户{get;internal set;}
公共虚拟ICollection主用户{get;internal set;}
}  
公共抽象类CoreUser
{
[关键]
public int UserId{get;set;}
public int InstanceId{get;set;}
公共虚拟实例实例{get;set;}
}
[表(“用户”)]
公共类用户:CoreUser
{
公共字符串用户名{get;set;}
}
[表(“主用户”)]
公共类主用户:CoreUser
{
公共字符串主用户名{get;set;}
}
这是我的DbContext:

公共类MyContext:DbContext
{
公共数据库集用户{get;set;}
公共数据库集主用户{get;set;}
公共数据库集实例{get;set;}
}
这将使用TPT继承模型创建4个表,这很好。问题是Users和MasterUsers表将包含实例的外键(称为Instance_InstanceId),这是冗余的,因为此FK是在CoreUser基类中定义的。这两个FK列甚至没有填充,它们始终为NULL,当您添加User或MasterUser时,会填充CoreUsers InstanceId列

如果我像这样从实例类中删除两个引用:

公共类实例
{
public int InstanceId{get;set;}
} 
问题消失了,但这也使我的应用程序无法使用。 我也可以这样解决我的问题:

公共类实例
{
public int InstanceId{get;set;}
公共虚拟ICollection用户{get;internal set;}
} 
然后迭代槽集合过滤掉每种类型的用户,但这种方法将延迟加载所有用户,即使我只想迭代槽主用户

一种可能的解决方案是使用TPC,但实际上,CoreUser类将包含TPC不支持的其他一些类的FKs(只有层次结构中的顶级类可以包含FKs)。 是否有任何方法可以让它在EF中使用实例类中的两个单独列表并延迟加载它们

编辑

实际上,上面的代码可以正常工作。如果您再引入一个引用CoreUser的类,它将中断,例如:

公共类用户策略
{
public int PolicyId{get;set;}
公共虚拟CoreUser策略用户{get;internal set;}
} 

设法避开了这个问题。我能够使用的解决方案是将CoreUser和Instance之间的关系移动到User和MasterUser,如下所示:

公共类实例
{
public int InstanceId{get;set;}
//仍然引用两个列表
公共虚拟ICollection用户{get;internal set;}
公共虚拟ICollection主用户{get;internal set;}
}  
公共抽象类CoreUser
{
[关键]
public int UserId{get;set;}
//没有对实例的引用。如果您不需要从CoreUser获得它,则可以使用它
}
[表(“用户”)]
公共类用户:CoreUser
{
//FK到CoreUser中定义的实例
public int InstanceId{get;set;}
公共虚拟实例实例{get;set;}
公共字符串用户名{get;set;}
}
[表(“主用户”)]
公共类主用户:CoreUser
{
//FK到MasterUser中定义的实例
public int InstanceId{get;set;}
公共虚拟实例实例{get;set;}
公共字符串主用户名{get;set;}
}

只是浪费代表积分。在EF中将单个FK映射到2个集合导航属性是不可能的。