Исключение сопоставления в Entity Framework

У меня есть большая база данных для многоязычного приложения, которое получает свои тексты с сервера, вставляет их в базу данных, затем, основываясь на предпочитаемом пользователем языке, находит соответствующий текст.

Позвольте мне сначала описать базу данных, затем я скажу мою проблему: Иллюстрация: например, у меня есть таблица Product, который имеет внешний ключ (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);

но я получаю ошибку:

При обработке запроса возникла исключительная ситуация "Сопоставление". Смотрите внутреннее исключение.

Внутреннее исключение:
При использовании поиска без учета регистра найдено несколько карт свойств для свойства 'translation'.

Обратите внимание, что есть много объектов, которые имеют те же отношения для перевода, что и 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();

1 ответ

Решение

Наконец-то исправили эту глупую проблему! Как говорится в сообщении об ошибке, проблема заключается в поиске без учета регистра, есть 2 свойства с именем translation в TranslationEntry Класс, я переименовал один из них и теперь все работает без проблем!

Другие вопросы по тегам