2010-12-21 39 views
1

这可能有点奇怪,但我只想将对象的标量属性保留到数据库。例如。假设我有两个表/实体“User”和“UserOrder”。 “User”实体具有“FirstName”,“LastName”,“UserOrders”(“UserOrder”的集合)。现在,我得到一个“User”对象,其中包含一些UserOrders。我需要坚持只有标量属性的“用户”,即FirstName &姓氏。POCO - 实体框架 - 仅支持标量属性

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

我问的原因是我必须在两个不同的步骤中分别坚持“User”和“UserOrders”。

回答

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。

0

你能解释为什么你需要在两个单独的步骤中做到这一点?无论哪种方式,如果你有导航属性的数量有限,你可以简单地存储在另一个变量&删除:

var orders = user.Orders; 
user.Orders = null; 
context.Users.AddObject(user); 

... 

context.Orders.AddObject(orders); // You might have to do these one by one 
+0

感谢您的回复。实际上,User和UserOrders就是一个例子。我们有一个复杂的系统,需要分两步进行存储,因为在此期间需要进行一些额外的验证。由于比标量更多的导航属性,并且由于我将在代码中再次使用所谓的“用户”对象,所以我认为创建新对象比保存对导航属性的引用更好。我们是否可以在EF中明确设置以仅存储标量(像ApplyCurrentValues在更新时一样)? – Jonna 2010-12-21 22:32:05