实体框架 - 如何返回没有相关对象的单个实体

时间:2016-01-25 16:01:09

标签: c# entity-framework-6

我在一个MVC项目中使用EF6,DB First, LazyLoading已关闭。 但是在更新一些实体属性时,我发现在更新同一上下文中的函数中的实体相关对象时,当我返回单个实体时,它还包含我已更新的相关对象。 我想仅返回单个实体。

所以我的问题是,是否有更好的方法来清理"除了创建新上下文并再次检索实体之外的相关实体?或者您会在不同的上下文中更新相关实体吗?或者有比这些更清洁的方法吗?

提前致谢!

1 个答案:

答案 0 :(得分:2)

您的问题是,您希望实体框架的行为方式与其不打算这样做。根据您的评论和问题,似乎在相同的上下文中,您正在触及父实体及其一个或多个子实体。因此,变更跟踪器会将所有这些整合在一起。

你的第二个问题是你的代码返回可能看起来像这样:

public ActionResult Stuff(){
    //MyEntityFrameworkClass is an autogenerated Entity Framework 
    //object that represents a table in your database
    List<MyEntityFrameworkClass> items = db.MyEntityFrameworkClass.ToList();
    Return Json(items);
}

这很糟糕,因为您要为数据库中的每个项目返回所有项目,包括已附加的任何相关实体。在这些情况下会发生什么:

  • 您不需要返回每一列
  • 您想要返回一些未包含在实体中的自动计算列
  • 您需要来自多个实体的值

这是视图模型(或数据传输对象)发挥作用的地方。创建一个模型,指定完全您的客户需要的内容,仅此而已。

public class MyApiModel(){
   public string Name {get;set;}

   public int SomethingElse {get;set;}

   //Computed property in our view model
   //Lets say anything greater than 2 is valid
   public bool IsValid => SomethingElse > 2;
}

现在你应该返回这种类型对象的List(或其他)。

public ActionResult Stuff(){
    List<MyApiModel> items = db.MyEntityFrameworkClass.Select(x=>new MyApiModel{
          //Notice I am not setting the isvalid property
          //Its computed, class takes care of returning proper value
          Name = x.MyNameColumn, 
          SomethingElse = x.MyOtherColumn
    }.ToList();
    Return Json(items);
}