使用额外的 SomeMap 表扩展和继承 EF 中的 BaseClass 时,如何解决“无效的列名‘Discriminator’”错误?

问题描述 投票:0回答:2

我一直在重构一些代码,但无法克服 EF 错误。我有一个 BaseClass,我在许多不同的项目中很大程度上复制了它,区别在于其中一些项目有一个额外的 SomeMap 表,该表是 BaseClass 的外键。因此,我的目标是将 BaseClass 移至项目只需引用的库,并仅针对需要它的项目使用 SomeMap 对其进行扩展,从而从库中的 BaseClass 实现中删除 ICollection 属性。这是正在发生的事情的一个非常简化的版本(可能甚至无法编译..)。这就是 BaseClass 过去的样子:

public partial class BaseClass
{

    public BaseClass(){}

    public int baseID {get; set;}

    public int otherID {get; set;}

    public string someName {get; set;}

    public virtual ICollection<SomeMap> SomeMap {get; set;}

}

这就是映射表的样子,其中 baseID 外键指向基表:

public partial class SomeMap
{

    public SomeMap(){}

    public int mapID {get; set;}

    public int someOtherID {get; set;}

    public int baseID {get; set;}

    public double someValue {get; set;}

    public virtual BaseClass BaseClass {get; set;}

}

所以,基本上我所做的就是从现在位于引用的 dll 中的 BaseClass 中删除 SomeMap ICollection<>,然后添加到 SomeMap 类,结果如下:

public partial class SomeMap
{

    public SomeMap(){}

    public int mapID {get; set;}

    public int someOtherID {get; set;}

    public int baseID {get; set;}

    public double someValue {get; set;}

    public virtual BaseClassExt BaseClass {get; set;}
}

public partial class BaseClassExt : BaseClass
{
    public virtual ICollection<SomeMap> SomeMap {get; set;}
}

在我的 OnModelCreating 重写方法(在我的项目中,而不是 dll 中)中,我有以下流畅的 API 调用:

modelBuilder.Entity<BaseClassExt>().HasMany(t => t.SomeMap).WithRequired(t => t.BaseClass).WillCascadeOnDelete(false);

我已经尝试了在这里可以找到的几乎所有解决方案,包括将 [NotMapped] 属性添加到新的扩展类(似乎不允许它工作),以及各种其他流畅的 API 调用以尝试显式地以其他方式定义外键关系。一切都会导致错误的一些变化:

'执行命令定义时发生错误。有关详细信息,请参阅内部异常。内部异常 SqlException:无效的列名称“Discriminator”。'

每当我尝试开始使用 object.SomeMap.Where(t => t.BaseClass.someName == someName_)... 等来提取和处理数据时

谢谢

更新

通过将以下内容添加到 OnModelCreating 方法,我可以取得轻微的进展:

modelBuilder.Entity<BaseClass>().Map(t => t.Requires("Discriminator").HasValue(0));

但是,这只会导致不同的错误消息:

'从第 14、34 行开始的映射片段出现问题:EntityTypes BaseClass、BaseClassExt 被映射到表 BaseClass 中的相同行。映射条件可用于区分这些类型映射到的行。'

c# entity-framework dbcontext
2个回答
0
投票

好吧,我能弄清楚这一点,所以这就是答案,所以你们都不会浪费生命中的日子......

除了我上面提到的流畅的 API 调用之外,您还需要更多一些来解决重复的映射错误。所以最后,你的 OnModelCreating() 需要看起来像:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<BaseClass>().Map(t => 
        t.Requires("Discriminator").HasValue(0));

    modelBuilder.Ignore<BaseClass>();

    modelBuilder.Entity<SomeMap>().ToTable("BaseClass");
}

0
投票

我被困在这里大约两天了。谢谢你。效果非常好。

© www.soinside.com 2019 - 2024. All rights reserved.