我一直在重构一些代码,但无法克服 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 中的相同行。映射条件可用于区分这些类型映射到的行。'
好吧,我能弄清楚这一点,所以这就是答案,所以你们都不会浪费生命中的日子......
除了我上面提到的流畅的 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");
}
我被困在这里大约两天了。谢谢你。效果非常好。