首先使用实体框架代码获取InvalidOperationException

本文关键字:代码 获取 InvalidOperationException 框架 实体 | 更新日期: 2023-09-27 18:02:23

我参与了一个项目,我们先使用实体框架代码将已经存在的c#代码映射到数据库。我不打算在这里重现代码本身,但我将提供一些伪代码,它们应该涵盖相同的问题。

我正试图将一个类映射到具有其他类列表的数据库。我给你看一个例子:

public Class ListClass 
{
    public List<SubClassA> ListOne
    {
        get { return BaseClass.OfType<SubClassA>().Where(b => !b.BoolOne && b.BoolTwo).ToList(); }
    }
public List<SubClassA> ListTwo
    {
        get { return BaseClass.OfType<SubClassA>().Where(b => b.BoolOne && b.BoolTwo).ToList(); }
    }
}

public abstract class BaseClass
{
    public bool BoolOne {get; set;}
    #Region EF
    public GUID PrimaryKey {get; set;}
    public GUID ListClassForeignKey {get; set;}
    #EndRegion
}
public class SubClassA : BaseClass
{
    public bool BoolTwo {get; set}
}
Class SubClassB : BaseClass
{
    //Contents..
}

Summary: ListClass包含SubClassA的列表。BaseClass和SubClassA不知道ListClass的任何信息。添加BaseClass中的guid属性是为了与实体框架一起使用,否则没有改变现有的类。这就是为什么我们在这个项目中使用Fluent API:

class ListClassConfiguration : EntityTypeConfiguration<ListClass>
{
    public ListClassConfiguration()
    {
        HasKey(f => f.PrimaryKey);
        Property(f => f.PrimaryKey).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        HasMany(f => f.ListOne).WithOptional().HasForeignKey(f => f.ListClassForeignKey);
        HasMany(f => f.ListTwo).WithOptional().HasForeignKey(f => f.ListClassForeignKey);
    }
}

在context -类中,我们只需添加这个配置。每当模型更改时,数据库就会被删除。我目前使用tph映射的BaseClass和它的子类。

当我尝试添加并保存列表中引用对象的ListClass时,我得到了这个异常:

InvalidOperationException。外键组件'ListClassForeignKey'不是类型'SubClassA'的声明属性。验证它没有被显式地从模型中排除,并且它是一个有效的原语属性。

那么,有什么建议吗?

编辑:我注意到在实际项目中,似乎有空列表。我试图删除配置类中的外键,并且我得到了一个没有内容的数据库(一行中只有列中的null值)。在本例中,这意味着名称为'BaseClass'的tph表是空的/只有null值。这能解释部分问题吗?

首先使用实体框架代码获取InvalidOperationException

没关系,一位同事指出了列表属性的一个问题:只有getter,没有setter,并且它们基于BaseClass的列表,该列表也被ListClass

使用