ASP.NET MVC/EF: как мне обрабатывать свойства навигации в новом объекте?

Мое конкретное приложение — это приложение ASP.NET MVC, использующее Entity Framework.

У меня есть объект Entity0, который содержит ссылку (* на 1) на Entity1...

public class Entity_0
{
    public int ID { get; set; }
    public int Entity_1_ID { get; set; }
    public Entity_1 Entity_1 { get; set; }
}

У меня также есть некоторая логика в Entity_0, однако эта логика требует, чтобы Entity_1 не был нулевым...

public Entity_2 GetEntity_2()
{
    return new Entity_2() { Number = Entity_1.Value * 10 };
}

Когда новый экземпляр Entity_0 создается посредством привязки модели в контроллере, устанавливается свойство Entity

public class Entity_0
{
    public int ID { get; set; }
    public int Entity_1_ID { get; set; }
    public Entity_1 Entity_1 { get; set; }
}
ID, однако свойство навигации Entity_1 остается нулевым до тех пор, пока оно не будет сохранено в базе данных.

Мне нужно вызвать GetEntity_2() и сохранить Entity_0 и Entity_2 в базе данных как единое целое. Прямо сейчас это означает, что я должен вручную извлечь Entity_1 из репозитория и назначить его Entity_0 перед вызовом функции.

Другим вариантом, который я рассматривал, было бы сделать Entity_1 параметром метода GetEntity_2, однако в любой другой раз, когда этот метод вызывается, Entity_1 не будет иметь значение null, поэтому было бы избыточно требовать параметр.

Итак, очевидно, что все работает прямо сейчас, но мой вопрос заключается в том, нарушаю ли я какое-то правило проектирования ООП либо а) имея метод, который может генерировать исключение нулевой ссылки, либо б) указывая параметр метода, который должен использоваться только некоторые из время.

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

Спасибо!


person Jeff Camera    schedule 02.10.2010    source источник


Ответы (1)


О, это оказалось намного проще, чем я себе представлял!

Свойство навигации Entity_1 заполняется после добавления объекта в контекст. У меня сложилось впечатление, что он был нулевым, пока я не вызвал SaveChanges() и не сохранил его в базе данных.

Это упрощает вызов кода следующим образом...

var entity_1 = Entity_1CreateViewModel.Entity_1;
entitiesRepository.Add(entity_1);
entitiesRepository.Add(entity_1.GetEntity_2());
entitiesRepository.Save();
person Jeff Camera    schedule 04.10.2010