我有一个基类,几乎所有其他东西都从它继承..
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”中的角色“Org_Owner_Source”中无效。因为从属角色属性不是关键属性,所以从属角色的多重性的上限必须是“*”。
为了克服这个问题,我添加了以下 Fluent API 代码:
modelBuilder.Entity<MyBaseClass>()
.HasRequired(e => e.Owner)
.WithMany()
.HasForeignKey(e => e.OwnerId)
.WillCascadeOnDelete(false);
这解决了Invalid Multiplicity
错误,但是当我随后运行查询时,它返回“序列不包含元素错误”。当我检查生成的命中数据库的 SQL 代码时,我发现查询的 ' from
' 子句引用了一个不存在的 MyBaseClassClasses 表,而不是预期的 Orgs 表。
运行迁移还会引发“序列不包含元素”错误。无论如何,我不希望所有继承自的类都MyBaseClass
被非规范化为单个 MyBaseClassClasses 表。
问题:
- 在这种情况下,流利的 api 代码是否正确?
- 如果不是,应该是什么?
- 如果是,那么我该如何克服“序列不包含元素”错误?
** * **后续编辑* ** * ** * ** * ** * ** * **
我一直在尝试的另一种方法是删除流体映射和以下类定义:
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 继承的任何其他类都可以具有延迟加载 Owner 属性,如果该属性直接输入到子类中并且创建了一个流式 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);