Вопрос

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

Предположим, есть две таблицы: Category и CategoryDetail.Категория содержит CategoryId (PK), ParentId и TemplateId.КатегорияDetail содержит CategoryId (FK), LanguageId, Title и Описание (на соответствующем языке) с объединенным PK CategoryId и LanguageId.

Если я перетащу эти таблицы в конструктор LinqToSQL, результирующая объектная модель будет иметь категорию с коллекцией объектов CategoryDetail, чего никогда не должно быть.Я хотел бы иметь возможность фильтровать LanguageId на уровне DataContext, а это означает, что вся категория инкапсулируется в Category.CategoryDetail, а не все языковые версии инкапсулируются в Category.CategoryDetails.

Эта база данных отлично работала в моей старой библиотеке объектов (старомодные пользовательские BOL и DAL), но я боюсь, что LinqToSQL потребует ее изменения, чтобы дать мне требуемый результат.

Каков наилучший способ сделать эти отношения (и языковую фильтрацию) максимально гладкими?

Это было полезно?

Решение

Вы можете просмотреть свойства ассоциации.(Щелкните правой кнопкой мыши на строке, представляющей ассоциацию, и отобразите свойства.) Свойства сообщат вам, является ли это связью «один-к-одному» или «один-ко-многим».Это отражается в коде посредством ассоциации либо одной сущности (один-к-одному), либо ассоциации набора сущностей (один-ко-многим).

Другие советы

Я должен был бы предположить, что это не может быть истинным 1 к 1.Похоже, у вас есть ПК CatID и Lang ID в таблице Cat Details.Это объяснило бы, почему мы собираем коллекцию.Я могу ошибаться, поскольку вы не упомянули ПК таблицы CatDetails.

РЕДАКТИРОВАТЬ:Комбинация Pk CatID и Lang ID создает отношение 1:m, и Linq to SQL на самом деле делает правильные вещи.Единственный способ, которым это могло бы быть истинным 1:1, - это если бы у вас также был идентификатор языка в таблице cat, и он был частью FK.Я думаю, вам, возможно, придется переосмыслить то, что вы хотите сделать, или то, как вы хотите это реализовать.

Я думаю, что LINQ to SQL напрямую моделирует структуру базы данных.У вас есть две таблицы, поэтому создается 2 объекта.

Взгляните ли вы на LINQ to Entities, это позволяет вам создать еще один уровень над структурой базы данных, чтобы сделать классы более читаемыми.

Поскольку у вас нет отношения 1:1, одно только сопоставление не обеспечит желаемую функциональность.Однако в родительском автоматически сгенерированном классе легко предоставить метод, который выполнит эту работу:

public partial class Category 
{
  public IEnumerable<CategoryDetail> GetDetailsByLanguage(string langID)
  {
    return this.CategoryDetails.Where(c => c.LangID == langID);
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top