Entity framework 4 实体框架:I不&x27;我不理解EntityCollection.Attach和EntityReference.Attach的用途

Entity framework 4 实体框架:I不&x27;我不理解EntityCollection.Attach和EntityReference.Attach的用途,entity-framework-4,Entity Framework 4,ObjectContext.Attach和ObjectSet.Attach用于将分离的实体(已存在于数据库中)附加到上下文–这种方式在调用ObjectContext.SaveChanges时,EF不会尝试为此附加的实体发送insert命令 但是我不明白EntityCollection.Attach和EntityReference.Attach的目的。也就是说,这两种方法只能附加已由ObjectContext管理的实体(因此,它们不能用于附加EntityState设置为Added或Distache

ObjectContext.Attach
ObjectSet.Attach
用于将分离的实体(已存在于数据库中)附加到上下文–这种方式在调用ObjectContext.SaveChanges时,EF不会尝试为此附加的实体发送insert命令

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

由于
ObjectContext
管理的实体已经自动解析了它们的关系(即它们的
EntityReference
属性返回父实体,而它们的
EntityCollection
属性包含相关的子实体),我无法理解使用
EntityCollection.Attach
EntityReference.Attach
将相关实体E1附加到特定实体E2,因为E1已经通过
ObjectContext
自动附加到E2


如果您在ObjectContext中有一位客户,并且希望获得该客户,请以您为例感谢您 客户的预订,您可以拨打以下电话:

myCust.Reservations.Load()
这将加载该客户的所有预订。 但是,如果要筛选这些保留,可以在中使用CreateSourceQuery- stead,如以下代码所示:

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);
var customer=context.Contacts.OfType().First();
var sourceQuery=customer.Reservations.CreateSourceQuery()
其中(r=>r.ReservationDate>newdatetime(2008,1,1));
customer.Reservations.Attach(sourceQuery);
调用Attach方法时将执行查询。现在,只有该客户的预订子集将从数据库中检索并具体化为 对象

还可以使用CreateSourceQuery对类型进行筛选。在以下代码中,“附加”是 与实体引用一起使用,这将不需要IQueryable。相反,你需要 传入一个对象,可以使用FirstOrDefault查询方法获取该对象。自从 Attach将引发异常如果您试图传入null,则需要测试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);
}
var addresses=context.addresses.Take(5);
foreach(地址中的变量a)
{
var sq=a.ContactReference.CreateSourceQuery()
.OfType().FirstOrDefault();
如果(sq!=null)
a、 联系参考。附件(sq);
}

有了这段代码,只会加载客户。

hi,以我目前的EF编程经验(几乎不存在),我觉得CreateSourceQuery并没有那么有用。EntityCollection.Attach和EntityReference.Attach在其他情况下有用吗?