2016-10-13 5 views
1

私は、サーバーからテキストを取得し、データベースに挿入し、ユーザーの優先言語に基づいて適切なテキストを検索する多言語アプリケーションのための大きなデータベースを持っています。Entity Frameworkでのマッピングの例外

私は最初、私は私の問題を言うよ、データベースを記述してみましょう: enter image description here イラスト:例えば私は順番にTranslationEntryに接続Translationテーブルへの外部キー(Description列)を持つテーブルProductを、持っていますすべての言語で製品の説明をすべて翻訳した表。

言語は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); 

ここではデータのサンプルセット:今すぐ

enter image description here

PR oblem:

A 'Mapping' exception occurred while processing the query. See the inner exception.

Inner exception:
More than one property map found for property 'translation' when using case-insensitive search.

注意として翻訳のために同じ関係を持っている多くの企業があること:私は、次のコマンド

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(); 

答えて

0

最後に、この愚かな問題を修正しました! エラーメッセージが示すように、問題は大文字と小文字を区別しない検索であり、TranslationEntryクラスに2つの名前の変換があり、そのうちの1つの名前が変更されました。

関連する問題