Entity Framework, связывание таблиц и сопоставление нескольких таблиц с одним объектом - PullRequest
1 голос
/ 25 января 2012

У меня есть объект под названием «Продукт», этот объект посредством сопоставления таблиц объединяет 6 таблиц, которые имеют отношение от 1 до 1..0, с «Продуктами».Это все работает чудесно.Есть еще одно свойство, которое я хочу добавить в «Продукты», это sBBR_rate, это значение отсутствует в таблице с прямой связью от 1 до 1..0, оно связано через таблицу ссылок, как показано ниже:

SQL server diagram

Когда я импортирую две таблицы в EDM, я не вижу пути в «Сведениях о сопоставлении» в «Продукте» для ссылки на sBBR_rate.Я могу сослаться на RatesLink и связать его с первичным ключом «Products», однако я не могу сослаться на таблицу BBR.

EDM

Методы, которые я могу придумать, чтобы работать «вокруг»это выглядит следующим образом:

  • Создание вида, ссылка на вид в EDM.
  • Создайте SP и используйте функцию импорта для получения BBR, когда это необходимо.
  • Создайте сущность "Rates" в EDM, которая затем может втянуть в нее значение sBBR_rate.Перейдите к BBR Products через Product.Rates.sBBR_rate.

Есть ли лучший способ сделать это, который не очень похож на выдумку?Возможно, путем непосредственного редактирования XML картографических или концептуальных слоев EDM?

Спасибо за ваш вклад.

Ответы [ 3 ]

2 голосов
/ 25 января 2012

Модель, которую мы используем, заключается в расширении сущностей с помощью частичных классов, которые мы считаем полезными, чтобы мы могли получить дополнительные свойства в автоматически сгенерированных классах (мы используем шаблон POCO T4 для автогена, но я считаю, что это будет работать так же хорошо с генерацией объекта объекта по умолчанию).

Итак, мы бы получили

//.. this one is from the T4 template
public partial class Product
{
    //.. all the autogenerated methods
}

и в отдельном файле, который не генерируется автоматически

//.. now in a separate file created by me
public partial class Product
{
   //.. my custom properties and methods to make the entities more usable
   public string BBRRate
   {
     get {return this.RatesLink.BBR.sBBR_rate; } 
   }
}

Это означает, что я могу просто сделать

myProduct.BBRRte

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

Мы также экспериментировали с подключением к событию ObjectMaterialized в классе ObjectContext для предварительной загрузки некоторых из этих свойств. Используя пользовательский интерфейс, т. Е. IMaterialisable, мы можем проверить, относится ли объект к этому типу, а затем вызвать метод (Materialise) для предварительного заполнения некоторых свойств. Это кажется хорошей идеей, но мы не использовали ее широко - было легко загружать слишком много вещей. Если вы выполняете загрузку свойств в частичных классах, это становится более эффективным. Просто мой опыт.

В любом случае - как всегда интересный вопрос и удачи снова с вашим разработчиком.

EDIT

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

  1. Создайте представление в базе данных и внесите его, как вы уже упоминали. TBH это то, что я бы сделал.
  2. Используйте элемент DefiningQuery непосредственно в xml (слой хранилища) и сопоставьте запрос с пользовательским объектом вашего точного дизайна. Джули Лерман описывает это как окончательный выходной люк для Entity Framework.

Помните: если вы вручную измените XML в пункте 2, вы потеряете возможность автоматического обновления модуля через IDE

2 голосов
/ 25 января 2012

Поскольку кратности в отношениях Product -> RatesLink и RatesLink -> BBR равны от 0 до 1, вы должны иметь доступ к sBBR_rate из экземпляра Product, например:

myProductInstance.RatesLink.BBR.sBBR_rate

Я вижу на скриншоте EDM, что RatesLink имеет свойство Product и BBR, что указывает на то, что это должно быть доступно - не так ли?

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

1 голос
/ 22 мая 2012

Я закончил тем, что создал представление и затем связал это представление в EDM, это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...