【问题标题】:Sequence contains no elements error with inheritance序列不包含元素继承错误
【发布时间】: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 表中。

问题:

  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' 中抛出“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


    【解决方案1】:

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

    例如:

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

    【讨论】:

    • 我尝试了该映射,但它仍然抛出“多重性无效”错误。还有其他想法吗?
    • 您的映射确实会产生更好的查询,查询到正确的表,但由于某种原因序列仍然为空。
    • 其实这个方案还是没有解决问题。无论我尝试何种数据注释和流体 api 条目的组合,我仍然会收到 Multiplicity is not valid 错误、Invalid Column "Owner_Id" 或 "Sequence is empty" 错误。
    猜你喜欢
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多