首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架:我不明白EntityCollection.Attach和EntityReference.Attach的用途

实体框架:我不明白EntityCollection.Attach和EntityReference.Attach的用途
EN

Stack Overflow用户
提问于 2011-11-15 19:25:47
回答 1查看 553关注 0票数 0

ObjectContext.AttachObjectSet.Attach用于将分离的实体(在DB中已经存在)附加到上下文中--这样,当调用ObjectContext.SaveChanges时,EF不会尝试为该附加实体发送插入命令

但我不明白EntityCollection.AttachEntityReference.Attach的目的。也就是说,这两个方法只能附加已经由ObjectContext管理的实体(因此它们不能用于将EntityState设置为AddedDetached的实体附加)。

而且,由于由ObjectContext管理的实体已经自动解决了它们的关系(即它们的EntityReference属性返回父实体,它们的EntityCollection属性包含相关的子实体),我无法理解使用EntityCollection.AttachEntityReference.Attach将相关实体E1附加到特定实体E2会得到什么好处,因为e 117E1E 218E 218已经附加到E 119/code>E2E 220由ObjectContext自动>

谢谢

EN

回答 1

Stack Overflow用户

发布于 2011-11-15 22:29:47

例如,如果您在ObjectContext中有一个客户,并且希望获得该客户的预订,您可以调用以下命令:

代码语言:javascript
复制
myCust.Reservations.Load()

这将加载对该客户的所有预订。但是,如果要筛选这些保留,可以使用CreateSourceQuery代替,如以下代码所示:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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);
}

使用此代码,将只加载客户。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8141955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档