Модель, которую мы используем, заключается в расширении сущностей с помощью частичных классов, которые мы считаем полезными, чтобы мы могли получить дополнительные свойства в автоматически сгенерированных классах (мы используем шаблон 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
Существует правило, что все на уровне магазина должно быть каким-то образом представлено на вашем концептуальном уровне. Поэтому удаление таблиц из концептуального слоя, но через некоторые свойства, я не думаю, будет работать в его грубой форме. Поэтому я могу придумать еще два варианта
- Создайте представление в базе данных и внесите его, как вы уже упоминали. TBH это то, что я бы сделал.
- Используйте элемент DefiningQuery непосредственно в xml (слой хранилища) и сопоставьте запрос с пользовательским объектом вашего точного дизайна. Джули Лерман описывает это как окончательный выходной люк для Entity Framework.
Помните: если вы вручную измените XML в пункте 2, вы потеряете возможность автоматического обновления модуля через IDE