Почему члены объекта домена (POCO) определяются как виртуальные? - PullRequest
5 голосов
/ 30 марта 2012

В видео с дополнительным видом http://www.asp.net/mvc. Элемент объекта модели был заменен виртуальным в середине видео. Он не дал подробного описания изменения. Кто-нибудь может уточнить необходимость?

public class Restaurant
{
    public virtual int ID { get; set; }
    public virtual string Name { get; set; }
    public virtual Address Address { get; set; }
    public virtual ICollection<Review> Reviews { get; set; }
}

Кстати, IDBContext в видео соответствует шаблону хранилища? Должен ли код использовать шаблон репозитория для лучшей практики, если это не так?

public interface IDbContext
{
    IQueryable<Restaurant> Restaurants { get; }
    IQueryable<Review> Reviews { get; }
    int SaveChanges();
    T Attach<T>(T entity) where T : class;
    T Add<T>(T entity) where T : class;
    T Delete<T>(T entity) where T : class;
}

Обновление: это должны быть различные шаблоны репозитория. Обычно шаблон репозитория создает один класс для одного объекта модели IRepository<T>. Этот помещает все объекты модели в один интерфейс Restaurants, Reviews. Как этот сравнивается с типичным?

Ответы [ 3 ]

8 голосов
/ 30 марта 2012

Подводя итог, чтобы POCO работал с EF, он создает прокси-классы, которые наследуются от ваших исходных классов сущностей (POCO).И поэтому ему необходимо, чтобы свойства были виртуальными, чтобы переопределить их, чтобы он мог подключать отслеживание изменений EF и работу инфраструктуры отложенной загрузки.В противном случае отслеживание изменений или отложенная загрузка не будут включены по умолчанию.

Для полного ответа на этот вопрос вам может понадобиться прочитать Работа с объектами POCO и Требования для создания прокси POCO

2 голосов
/ 30 марта 2012

При использовании Entity Framework свойства должны быть виртуальными, чтобы поддерживать отложенную загрузку.

1 голос
/ 30 марта 2012

Из статьи msdn ;«Для прокси-серверов отслеживания изменений:

Каждое свойство, которое сопоставлено со свойством типа сущности в модели данных, должно иметь неуплотненный (NotOverridable в Visual Basic), общедоступный и виртуальный (Переопределенный в Visual Basic)получить и установить методы доступа. "

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