2010-10-02 38 views
1

我的特殊应用程序是一个使用实体框架的ASP.NET MVC应用程序。ASP.NET MVC/EF:我应该如何处理新实体的导航属性?

我有一个对象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_1_ID属性设置,但直到它被保存到数据库的导航ENTITY_1财产保持为空。

我需要调用GetEntity_2()并将Entity_0和Entity_2作为单个工作单元保存到数据库中。这意味着我必须在调用函数之前手动从存储库中检索Entity_1并将其分配给Entity_0。

我考虑的另一个选项是让Entity_1成为GetEntity_2方法的一个参数,但是其他任何时候被称为Entity_1的方法都不会为null,因此需要一个参数将是多余的。

因此,显然现在一切正常,但我的问题是我是否违反了一些OOP设计规则,或者a)具有可能抛出空引用异常的方法或b)指定只应该有些时候会用到它。

不得不手动分配导航属性真的让我感到困扰。我希望你们中的一些人对我如何改善这一点有一些建议。

谢谢!

回答

0

啊,这竟然比我想象的要容易得多!

将对象添加到上下文后,导航属性Entity_1被填充。直到我调用SaveChanges()并将其保存到数据库之前,我的印象都是空的。

这可以很容易地调用的代码如下...

var entity_1 = Entity_1CreateViewModel.Entity_1; 
entitiesRepository.Add(entity_1); 
entitiesRepository.Add(entity_1.GetEntity_2()); 
entitiesRepository.Save();