1

我有一个基类,几乎所有其他东西都从它继承..

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 表。

问题:

  1. 在这种情况下,流利的 api 代码是否正确?
  2. 如果不是,应该是什么?
  3. 如果是,那么我该如何克服“序列不包含元素”错误?

** * **后续编辑* ** * ** * ** * ** * ** * **

我一直在尝试的另一种方法是删除流体映射和以下类定义:

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);
4

1 回答 1

2

那不是正确的流畅映射。通过调用modelBuilder.Entity<MyBaseClass>(),您是在告诉 Entity Framework 这MyBaseClass是一个实体并且应该以某种方式映射到数据库。相反,请使用您想要映射的最低类。

例如:

modelBuilder.Entity<Org>().HasRequired(e => e.Owner);
于 2013-05-13T16:05:41.447 回答