0

我参与了一个项目,我们使用 Entity Framework Code First 将现有的 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..
}

摘要: 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-class 中,我们只需添加此配置。每当模型更改时,数据库就会被删除。我目前正在为 BaseClass 及其子类使用 TPH 映射。

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

无效操作异常。外键组件“ListClassForeignKey”不是“SubClassA”类型的声明属性。验证它没有被明确地从模型中排除,并且它是一个有效的原始属性。

那么,有什么建议吗?

编辑:我注意到在实际项目中,似乎有空列表。我试图删除配置类中的外键,我得到了一个没有内容的数据库表(一行中只有 NULL 值)。在此示例中,这意味着名称为“BaseClass”的 TPH 表仅为空/只有 NULL 值。这能解释一些问题吗?

4

1 回答 1

0

没关系,一位同事指出了 list-properties 的一个问题:只有 getter,没有 setter,它们基于 ListClass 也使用的 BaseClass 列表

于 2013-03-05T11:56:15.500 回答