Должен ли я всегда ссылаться на класс Entity Object как DAL или я могу использовать его классы? - PullRequest
0 голосов
/ 05 июня 2011

Допустим, у меня есть таблица «Клиент» в БД SQL, и я использую Entity Framework.

Теперь, например, в Controller или ViewModel я получаю клиента по var customer = Page.Current.Customer, когда его код:

public class Page
{
     ...
     // Customer is EntityObject that created by Entity Framework
     public Customer Customer
     {
        get
        {
                return (new ContextEntity()).Customers.First();
        }
     } 
}

Мой вопрос:

Должен ли я ссылаться на класс Entity Object (Customer) как DAL и создавать CustomerWrapper или я могу использовать его в другом коде моего приложения?

Я имею в виду, правильно ли, что Page.Current.Customer вернет Клиентский объект , или я должен использовать Клиентский объект в качестве DAL, а Page.Current.Customer должен вернуть пользовательскийКлиент, какой-то CustomWrapper?

С одной стороны, если будет решено изменить имя таблицы Customer на site_Customer (в базе данных SQL), я обновлю EntityModel и изменит только код в классе страницы на

public class Page
    {
         ...
         // Customer is EntityObject that created by Entity Framework
         public Customer Customer
         {
            get
            {
                    return (new ContextEntity()).site_Customers.First();
            }
         } 
    }

Но, с другой стороны, у меня будет Customer Entity + WrapperCustomer

Что лучше?

Ответы [ 3 ]

1 голос
/ 05 июня 2011

Все классы в файле EDMX являются частичными классами. Это означает, что вы можете расширить эти классы, создав новый файл Class.

Например ...

public partial class Customer
{
    // Here are the methods, properties, relationships created by EDMX Wizard.
}

В другой области вашего проекта я обычно помещаю его в то же место, что и EDMX, вы можете добавить новый файл Class с такой же подписью.

public partial class Customer
{
    // Here are the methods, properties, etc. created by you.
}

Когда проект скомпилирован, эти два класса станут одним классом в скомпилированном коде. Теперь, когда вы меняете свой EDMX, да, он должен отображаться правильно, но это не всегда так, поскольку известно, что EF очень глючит (предположим, что это исправлено в EF 4.1 в MVC 3), вы можете просто изменить имя класса чтобы соответствовать тому, что есть в EDMX и "Вуаля!" Вы передали весь пользовательский добавленный код для класса в новый объект сущности. По сути, это ваша «оболочка класса».

0 голосов
/ 05 июня 2011

Если вы хотите использовать WCF, то вам, вероятно, потребуется создать чистые POCO, чтобы избежать множества проблем.

Если вы хотите, чтобы ваши контроллеры / viewmodels / pages / что-либо были тестируемыми на модуле, то вывам нужно будет абстрагировать ваш EntityContext в интерфейсах репозитория + классах (см. шаблон репозитория ).

Если вы просто хотите создать быстрое и простое не тестируемое приложение, тогда вам не нужнобеспокоиться об этом.Не забудьте распоряжаться контекстом данных в конце каждого запроса.

0 голосов
/ 05 июня 2011

Все зависит от уровня абстракции, который вы хотите использовать в своем приложении, и потребностей уровня представления. Оба подхода возможны.

Ваш код, вероятно, уже тесно связан с Entity Framework (EntityObject относится к типу EF) и также не очень хорошо тестируется (Page.Current, вероятно, является статичным), поэтому обсуждение некоторых более сложных архитектурных подходов и разделение проблем не нужно.

Несколько замечаний из вашего кода:

  • Контекст одноразовый !!!
  • Переименование чего-либо в вашей базе данных не должно изменять имена ваших классов. Это ответственность EF mapping (EDMX) за правильное сопоставление сущностей с новыми именами базы данных.
...