如果导航属性不存在则插入导航属性,如果没有密钥则存在它

时间:2012-05-24 13:31:22

标签: c# .net performance entity-framework navigation-properties

我有两张桌子:

Person table - 
       PersonID
       Name (unique index).
Orders table - 
       OrderID
       Price
       Item
       PersonID (FK)           

我想对订单表进行插入(使用EF),这将插入订单列表(所有订单都与同一个人,我只知道人名),如果此人不存在,我想要他将被插入到人员表中并且他确实存在该命令将填充合适的人。 我不想首先查询此人是否在人员表中,因为它是一个冗余呼叫。 有没有可能只在保存更改期间添加它并事先查询服务器? 类似的东西:

Person thePerson = new Person {Name = "knownName"};
foreach (var order in orders)
{
   context.Orders.AddObject(new Order
   {
      Price = order.Price,
      Item = order.ItemName,
      Person = thePerson
   });
}
context.SaveChanges();

1 个答案:

答案 0 :(得分:0)

如果使用PersonID属性,EF不会创建具有Name属性的Person对象,而是执行您想要的操作。但是这种行为仅限于主键,所以我认为不可能使用Name来实现这一点。

Person thePerson = new Person {PersonID = Id}; // Id is either previously fetched or a newly created one
foreach (var order in orders)
{
   context.Orders.AddObject(new Order
   {
      Price = order.Price,
      Item = order.ItemName,
      Person = thePerson
   });
}
context.SaveChanges();