实体框架多对多异常与继承
Posted
技术标签:
【中文标题】实体框架多对多异常与继承【英文标题】:Entity Framework Many To Many exception with inheritance 【发布时间】:2014-12-29 19:37:38 【问题描述】:我正在尝试在 Record 对象上创建两个多对多关系映射:
从
继承的记录对象public class Record
public virtual ICollection<Language> SourceLanguages get; set;
public virtual ICollection<Language> TargetLanguages get; set;
第二个对象
public class Language
public int Language get; set;
public string Locale get; set;
public string LanguageName get; set;
public virtual ICollection<Record> Records get; set;
记录地图
public class RecordMap : EntityTypeConfiguration<Record>
this.HasMany(r => r.SourceLanguages)
.WithMany(c => c.Records)
.Map(sl =>
sl.ToTable("SourceLanguageRecordMap", "dbo");
sl.MapLeftKey("RecordId");
sl.MapRightKey("LanguageId");
);
this.HasMany(r => r.TargetLanguages)
.WithMany(c => c.Records)
.Map(tl =>
tl.ToTable("TargetLanguageRecordMap", "dbo");
tl.MapLeftKey("RecordId");
tl.MapRightKey("LanguageId");
);
当我在上面列出的对象上运行迁移时,我收到以下错误:
System.Data.Entity.Core.MetadataException:指定的架构不是 有效的。错误:关系 'Toolbox.EntityModel.Contexts.Record_SourceLanguages' 未加载 因为类型 'Toolbox.EntityModel.Contexts.Language' 不是 可用的。 ...
指定的架构无效。错误:关系 'Toolbox.EntityModel.Contexts.Record_SourceLanguages' 未加载 因为类型 'Toolbox.EntityModel.Contexts.Language' 不是 可用。
如果我将以下行注释掉,它将仅适用于 一对多 映射,但是,它会将 RecordId_Record 添加到语言表中。知道为什么吗?
this.HasMany(r => r.TargetLanguages)
.WithMany(c => c.Records)
.Map(tl =>
tl.ToTable("TargetLanguageRecordMap", "dbo");
tl.MapLeftKey("RecordId");
tl.MapRightKey("LanguageId");
);
知道我做错了什么吗?
【问题讨论】:
【参考方案1】:如果您与同一个表有 2 个多对多关系,则需要创建 2 个单独的 ICollection
属性,以便 Entity Framework 完全了解您正在尝试执行的操作。您不能将它们合二为一,否则您会得到您所看到的那个可爱的错误。
【讨论】:
知道为什么我在尝试查询时会得到空结果吗? 因为映射错误,它没有从数据库中提取任何内容。 地图本身有问题吗?或者是别的什么?我现在在 Language.cs 上有两个 ICollections。 我不知道。不过,您可能应该将其作为一个单独的问题。以上是关于实体框架多对多异常与继承的主要内容,如果未能解决你的问题,请参考以下文章