ObjectContext.Attach和ObjectSet.Attach用于将分离的实体(在DB中已经存在)附加到上下文中--这样,当调用ObjectContext.SaveChanges时,EF不会尝试为该附加实体发送插入命令
但我不明白EntityCollection.Attach和EntityReference.Attach的目的。也就是说,这两个方法只能附加已经由ObjectContext管理的实体(因此它们不能用于将EntityState设置为Added或Detached的实体附加)。
而且,由于由ObjectContext管理的实体已经自动解决了它们的关系(即它们的EntityReference属性返回父实体,它们的EntityCollection属性包含相关的子实体),我无法理解使用EntityCollection.Attach或EntityReference.Attach将相关实体E1附加到特定实体E2会得到什么好处,因为e 117E1E 218E 218已经附加到E 119/code>E2E 220由ObjectContext自动>
谢谢
发布于 2011-11-15 22:29:47
例如,如果您在ObjectContext中有一个客户,并且希望获得该客户的预订,您可以调用以下命令:
myCust.Reservations.Load()这将加载对该客户的所有预订。但是,如果要筛选这些保留,可以使用CreateSourceQuery代替,如以下代码所示:
var customer=context.Contacts.OfType<Customer>().First();
var sourceQuery = customer.Reservations.CreateSourceQuery()
.Where(r => r.ReservationDate > new DateTime(2008, 1, 1));
customer.Reservations.Attach(sourceQuery);调用附加方法时,查询将执行。现在,将从数据库中检索该客户的预订子集,并将其具体化为对象。
还可以使用CreateSourceQuery对类型进行筛选。在下面的代码中,附加将与不接受EntityReference的IQueryable一起使用。相反,您需要传入一个对象,您可以使用FirstOrDefault查询方法获得该对象。由于如果尝试传递空,则附加将引发异常,因此需要在调用附加之前测试null:
var addresses = context.Addresses.Take(5);
foreach (var a in addresses)
{
var sq = a.ContactReference.CreateSourceQuery()
.OfType<Customer>().FirstOrDefault();
if (sq != null)
a.ContactReference.Attach(sq);
}使用此代码,将只加载客户。
https://stackoverflow.com/questions/8141955
复制相似问题