Определите отношения один-к-одному с LinqToSQL - PullRequest
3 голосов
/ 30 сентября 2008

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

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 30 сентября 2008

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

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

2 голосов
/ 30 сентября 2008

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

0 голосов
/ 30 сентября 2008

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

public partial class Category 
{
  public IEnumerable<CategoryDetail> GetDetailsByLanguage(string langID)
  {
    return this.CategoryDetails.Where(c => c.LangID == langID);
  }
}
0 голосов
/ 30 сентября 2008

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

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

...