EF 4.1 Codefirst: создание сложных навигационных свойств - PullRequest
1 голос
/ 18 сентября 2011

представьте себе простое POCO для EF 4.1 Codefirst:

public class Product
{
    // Native properties 
    [Key]
    public Guid ID { get; set; }

    // Navigation properties
    public virtual Category Category { get; set; }
    public virtual ICollection<Customer> Customers { get; set; }

    public Product()
    {
        this.ID = Guid.NewGuid();

        // Do I have to instantiate navigation properties in the constructor or not???
        this.Category = new Category();
        this.Customers = new List<Customer>();
    }
}

Что я до сих пор не могу понять, так это то, стоит ли мне создавать сложные навигационные свойства в конструкторе POCO или нет?

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

Существуют ли какие-либо правила, лучшие практики или побочные эффекты?

Спасибо за ваши идеи и советы!

1 Ответ

3 голосов
/ 18 сентября 2011

Вам не нужно создавать экземпляр Category.Категория - это отдельная сущность, которая существует или не существует - Продукт не несет ответственности за ее созданиеВам может понадобиться создать экземпляр Customers, чтобы очистить список.

Причина, по которой он работает сейчас, заключается в том, что ваш контекст обернет сущности динамическим прокси, который будет обрабатывать создание вашей коллекции Customers.Из-за этого другой код может получить доступ к коллекции без получения NullReferenceException.Это может измениться, если вы создадите экземпляр Product в своем коде без использования EF.В таком случае не будет динамического прокси-сервера, и ваша коллекция будет нулевой = вам придется создавать ее экземпляр самостоятельно.

...