序列不包含继承的元素错误

时间:2013-05-13 15:57:00

标签: entity-framework asp.net-mvc-4

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

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

问题:

  1. 在这种情况下,流畅的api代码是否正确?
  2. 如果不是,应该是什么?
  3. 如果是,那么我如何克服'序列包含无元素'错误?
  4. ** * ** 后续修改 * ** * ** * ** * ** * ** * **

    我尝试过的另一种方法是删除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);
    

1 个答案:

答案 0 :(得分:2)

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

例如:

modelBuilder.Entity<Org>().HasRequired(e => e.Owner);