实体框架多对多异常与继承

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。 我不知道。不过,您可能应该将其作为一个单独的问题。

以上是关于实体框架多对多异常与继承的主要内容,如果未能解决你的问题,请参考以下文章

多对多(自相关)特定订单实体框架

打印多对多实体时出现异常

自跟踪实体 SaveChanges() 在多对多关系中添加实体时出现异常

实体框架:多对多插入重复

删除多对多实体框架

删除多对多实体框架