我有一个基类,几乎所有其他东西都继承了它。
public abstract class MyBaseClass
{
public int Id { get; set; }
public int OwnerId{ get; set; }
public virtual Org Owner{ get; set; }
}
public abstract class Party: MyBaseClass
{
}
public class Org: Party
{
public string Name { get; set; }
public DateTime CreationDate { get; set; }
}
我的数据上下文有这样一行:
public DbSet<Org> Orgs { get; set; }
执行这样的查询时......
var orgs = db.Orgs;
我收到此错误:
多重性在关系中的角色'Org_Owner_Source'中无效 'Org_Owner'。因为Dependent Role属性不是关键 属性,从属角色的多重性的上限 必须是'*'。
为了解决这个问题,我添加了以下Fluent API代码:
modelBuilder.Entity<MyBaseClass>()
.HasRequired(e => e.Owner)
.WithMany()
.HasForeignKey(e => e.OwnerId)
.WillCascadeOnDelete(false);
这解决了Invalid Multiplicity
错误,但当我随后运行查询时,它会返回“序列包含无元素错误”。当我检查生成的SQL代码到达数据库时,我发现查询的'from
'子句正在引用一个不存在的MyBaseClassClasses表而不是Orgs表。
运行迁移也会抛出'序列不包含元素'错误。无论如何,我不希望所有从MyBaseClass
继承的类被非规范化为一个MyBaseClassClasses表。
问题:
** * ** 后续修改 * ** * ** * ** * ** * ** * **
我尝试过的另一种方法是删除Fluid Mapping并使用以下类定义:
public abstract class MyBaseClass
{
public int Id { get; set; }
[ForeignKey("Owner")]
public int OwnerId{ get; set; }
public virtual Org Owner{ get; set; }
}
public abstract class Party: MyBaseClass
{
}
public class Org: Party
{
public string Name { get; set; }
public DateTime CreationDate { get; set; }
}
此解决方案在关系'Org_Owner'中抛出“多重性在角色'Org_Owner_Source'中无效。因为从属角色属性不是关键属性,所以从属角色的多重性的上限必须为'*'。 “错误。
我能够部分地解决这个问题,因为我发现除了Org之外,从MyBaseClass继承的任何其他类都可以具有延迟加载所有者属性,如果该属性直接输入到子类并且流量api条目是制成。
例如:
public class MyOtherClass: MyBaseClass
{
public string Name { get; set; }
public string Whaterver { get; set; }
public virtual Org Owner{ get; set; }
}
使用流体API条目:
modelBuilder.Entity<MyOtherClass>().HasRequired(x => x.Owner).WithMany().HasForeignKey(x=>x.OwnerId).WillCascadeOnDelete(true);
答案 0 :(得分:2)
这不是正确的流畅映射。通过调用modelBuilder.Entity<MyBaseClass>()
,您告诉实体框架MyBaseClass
是一个实体,并且应该以某种方式映射到数据库。而是使用您想要映射的最低级别。
例如:
modelBuilder.Entity<Org>().HasRequired(e => e.Owner);