【发布时间】:2013-05-15 23:49:44
【问题描述】:
我有一个基类,几乎所有其他东西都从该基类继承..
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'。因为从属角色属性不是关键 属性,从属角色的多重性的上限 必须是“*”。
为了克服这个问题,我添加了以下 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' 中抛出“Multiplicity is not valid in Role '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);
【问题讨论】:
标签: entity-framework asp.net-mvc-4