【问题标题】:POCO - Entity Framework - Persisting only scalar propertiesPOCO - 实体框架 - 仅保留标量属性
【发布时间】:2010-12-21 22:09:25
【问题描述】:

这可能有点奇怪,但我只想将对象的标量属性保存到数据库中。例如。假设我有 2 个表/实体“用户”和“用户订单”。 “User”实体有“FirstName”、“LastName”、“UserOrders”(“UserOrder”的集合)。现在,我得到一个“用户”对象,其中包含一些用户订单。我需要保留“用户”的标量属性,即名字和姓氏。

如果我执行 context.Users.AddObject(user),它也会将“UserOrders”添加到数据库中(我不想要)。创建一个新的“用户”对象并将所有标量复制到其中是否是我唯一的选择(或者)我们是否可以明确告诉 EF 仅保留标量,即使其中还有其他导航属性?

我问的原因是我必须在 2 个不同的步骤中分别保留“用户”和“用户订单”。

【问题讨论】:

    标签: c# entity-framework poco


    【解决方案1】:

    非常奇怪 - 我相信你这样做是有原因的。

    您可以从模型中移除导航属性(例如非标量),这样您就可以分别保留这两个对象。

    第 1 步 - 添加用户:

    var user = new User { };
    user.UserOrders = new UserOrders { }; // compiler error! no property exists. good!
    ctx.Users.AddObject(user); // only user scalar properties added
    

    第 2 步 - 添加一个 UserOrder - 它仍然需要与用户“关联”:

    var relatedUser = ctx.Users.First(); // grab the user related to this order
    var userOrder = new UserOrder { UserId = relatedUser.UserId }; // explicitly set the FK
    ctx.UserOrders.AddObject(userOrder); // UserOrder added with appropriate FK
    

    应该工作 - 我以前没有尝试过,但试一试。

    请记住,这种方法的缺点是当您请求 User 时,您将无法急切/延迟加载 UserOrders - 您必须使用 LINQ 手动加入 FK。

    【讨论】:

      【解决方案2】:

      您能解释一下为什么需要分 2 个单独的步骤执行此操作吗?无论哪种方式,如果您的导航属性数量有限,您可以简单地存储在另一个变量中并删除:

      var orders = user.Orders;
      user.Orders = null;
      context.Users.AddObject(user);
      
      ...
      
      context.Orders.AddObject(orders); // You might have to do these one by one
      

      【讨论】:

      • 感谢您的回复。实际上,User 和 UserOrders 只是一个例子。我们有一个复杂的系统,它需要分两步存储,因为在此期间需要进行一些额外的验证。由于导航属性比标量更多,而且我将在代码中再次使用所谓的“用户”对象,我认为创建一个新对象比保存对导航属性的引用更好。我们可以在 EF 中明确设置仅存储标量(就像 ApplyCurrentValues 在更新时所做的那样)吗?
      • @Jonna:我不熟悉这样的东西,虽然它可能存在。
      猜你喜欢
      • 2012-04-25
      • 2011-04-19
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 2012-03-08
      • 1970-01-01
      相关资源
      最近更新 更多