EF4 и преднамеренное возвращение только * некоторых * свойств объекта - PullRequest
0 голосов
/ 14 июля 2011

Ребята, я знаю, что не очень хорошо сформулировал этот заголовок, но вот сценарий.

У меня есть уровень пользовательского интерфейса WinForm и средний уровень WCF, который обслуживает мои объекты сущностей EF4, которые (конечно) отображаются в таблицы моей базы данных. Все отлично работает.

Одним из моих объектов является клиент - и в таблице базы данных клиента три поля varbinary (max) для документов PDF. Таким образом, у моего объекта сущности есть три свойства Byte (), по одному для каждого документа.

Но когда я загружаю начальную сетку с перечнем Клиентов, она собирается перетащить ВСЕ эти данные PDF с МТ, создавая гораздо большую полезную нагрузку, чем мне обычно нужно.

В DataSets я бы написал свой SQL, чтобы он не включал двоичный файл PDF, - но для каждого из них я бы включил поле логического флага, чтобы указать, есть ли IS для загрузки, если пользователь этого хочет. Затем я бы при необходимости загружал PDF-файлы отдельным вызовом.

С EF4 - что лучше для этого?

Во-первых, я думаю поместить документы в дочернюю таблицу / дочерние объекты, поэтому я не перетаскиваю их через уровень с Клиентом. Одна проблема решена.

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

Я на правильном пути?

1 Ответ

3 голосов
/ 14 июля 2011

Я думаю, у вас есть три варианта:

1) Создайте собственный класс, в который вы проецируете нужные свойства:

public class MySpecialSelection
{
    public int ID { get; set; }
    public string Name { get; set; }
    // more
    public bool HasPDFDoc1 { get; set; }
    public bool HasPDFDoc2 { get; set; }
    public bool HasPDFDoc3 { get; set; }
}

using (var context = new MyContext())
{
    var mySpecialSelectionList = context.MyEntities.Where(...some predicate...)
        .Select(e => new MySpecialSelection
        {
            ID = e.ID,
            Name = e.Name,
            // ...
            HasPdfDoc1 = (e.PdfDoc1 != null),
            HasPdfDoc2 = (e.PdfDoc2 != null),
            HasPdfDoc3 = (e.PdfDoc3 != null),
        }).ToList();

    // ...
}

Вместо «именованного» объекта вы также можете проецировать на анонимные типы.

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

2) Разделение таблиц: это означает, что вы разделяете свою единую сущность на два отдельных класса, связанных свойством навигации. Затем вы можете отобразить оба объекта в одну таблицу в базе данных. Это позволяет вам загружать свойства навигации (например, двоичные поля) по запросу (ленивая, энергичная или явная загрузка). Подробности об этом для EF4.0 здесь и для EF4.1 здесь .

3) Ваше собственное предложение: создание отдельных таблиц и отдельных сущностей, связанных свойствами навигации и ограничениями FK.

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