【问题标题】:Mapping exception in Entity Framework实体框架中的映射异常
【发布时间】:2016-10-21 22:16:51
【问题描述】:

我有一个用于多语言应用程序的大型数据库,它从服务器获取文本,插入数据库,然后根据用户首选语言找到合适的文本。

让我先描述一下数据库,然后我会说我的问题: 说明:例如,我有一个表Product,它有一个指向Translation 表的外键(Description 列),而Translation 表又连接到TranslationEntry 表,该表包含所有语言的产品描述的所有翻译。

这些语言位于一个名为Language 的单独表中,该表具有TranslationEntry 表的外键。

public class Product : BaseModel
{
    public int description { get; set; }
    public virtual Translation Description { get; set; }
}

public class Translation : BaseModel
{
    public Translation()
    {
        Products = new List<Product>();
    }
    public virtual ICollection<Product> Products { get; set; }
    public virtual ICollection<MainCategory> MainCategories { get; set; }
    public virtual ICollection<Caption> Captions { get; set; }
}

public class TranslationEntry : BaseModel
{
    public string text { get; set; }
    public int language { get; set; }
    public virtual Language Language { get; set; }
    public int translation { get; set; }
    public virtual Translation Translation { get; set; }
}

public class Language : BaseModel
{
    public Language()
    {
        TranslationEntries = new List<TranslationEntry>();
    }

    public string title { get; set; }
    public string language_code { get; set; }
    public virtual ICollection<TranslationEntry> TranslationEntries { get; set; }
}

public  class BaseModel
{
    public  int id { get; set; }
    public  int MembershipId { get; set; }
    public  SyncStatus SyncState { get; set; }
    ....
}

翻译条目映射:

        HasRequired(translationEntry => translationEntry.Translation)
            .WithMany(translation => translation.TranslationEntries)
            .HasForeignKey(translationEntry =>
                new {translationEntry.translation, translationEntry.MembershipId, translationEntry.SyncState})
                .WillCascadeOnDelete(false);

        HasRequired(translationEntry => translationEntry.Language)
            .WithMany(language => language.TranslationEntries)
            .HasForeignKey(translationEntry =>
                new {translationEntry.language, translationEntry.MembershipId, translationEntry.SyncState})
                .WillCascadeOnDelete(false);

        Property(t => t.translation)
            .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_translatinlanguageOd", 1) { IsUnique = true }));
        Property(t => t.language)
            .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_translatinlanguageOd", 2) { IsUnique = true }));

产品映射:

HasRequired(product => product.Description)
            .WithMany(translation => translation.Products)
            .HasForeignKey(product => new { product.description, product.MembershipId, product.SyncState })
            .WillCascadeOnDelete(false);

此处的数据集示例:

现在的问题:我想获取产品的描述,我使用以下命令

var o = databaseContext.Products.ToList().First(p=>p.id==1)?.Description.TranslationEntries.First(te=>te.language==1);

但我得到一个错误:

处理查询时发生“映射”异常。查看内部异常。

内部异常:
使用不区分大小写的搜索时,为属性“翻译”找到了多个属性映射。

请注意,有许多实体与我展示的Product 表具有相同的翻译关系。


UPDATE: 我的临时解决方案是这样的:

var Language = context.Languages.Include(l => l.TranslationEntries)
                        .Where(l => l.id == languageId)
                        .ToList()
                        .FirstOrDefault();
TranslationEntries = Language?.TranslationEntries;
var translatedText = (from t in TranslationEntries where t.translation == 2 select t.text).FirstOrDefault();

【问题讨论】:

    标签: c# sql-server entity-framework ef-fluent-api


    【解决方案1】:

    终于解决了这个愚蠢的问题! 正如错误消息所说,问题是通过不区分大小写的搜索,TranslationEntry 类中有 2 个名为 translation 的属性,我重命名了其中一个,现在一切正常!

    【讨论】:

      猜你喜欢
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 2017-02-11
      • 2011-03-09
      • 1970-01-01
      • 2014-04-01
      • 1970-01-01
      相关资源
      最近更新 更多