2011-07-06 62 views
1

我有一个实体BusinessUnit,它与Contact实体有多对多的关系。我们使用流利的配置按照下面的示例:EF 4.1代码优先:触发更新多对多

public BusinessUnitConfiguration() 
{ 
    HasMany(c => c.Contacts) 
     .WithMany() 
     .Map(m => 
      { 
       m.ToTable("BusinessUnitContact"); 
       m.MapLeftKey("BusinessUnitId"); 
       m.MapRightKey("ContactId"); 
      }); 

    ToTable("BusinessUnit"); 
} 

public ContactConfiguration() 
{ 
    ToTable("Contact"); 
} 

联系人实体不知道什么父母它可能与。我们使用Silverlight + WCF,所以懒惰的加载和代理创建被禁用。

我们在客户端上创建或修改一个由BusinessUnit实例和零个或多个Contact实例组成的对象图,然后发送给WCF服务进行保存,在此创建新的上下文,并根据需要添加/附加/删除在保存更改之前。

的问题是,如果我添加新的联系人通讯录收集现有业务单元,EF不会插入接线纪录 - 它知道要添加新的联系人,因为我已经添加了它,而不是BusinessUnitContact行将业务单位映射到联系人。

BusinessUnit上的Contacts属性是一个ObservableCollection < Contact>。它在添加父业务单位时起作用,但在附加时不起作用。

有没有一种方法可以告诉EF在将联系人关联附加到上下文时修改联系人关联,以便确定哪些新联结记录需要插入?

+0

您应该显示用于执行修改的代码。 –

回答

0

我发现了这个问题。这是安装在父实体到所述EF上下文有关的代码实际上并没有直接连接 - 它被加载原始实体,然后在从所述实体的属性合并附着:

// attach entity 
var existing = GetQuery<TEntity>().FirstOrDefault(e => e.Id == entity.Id); 
if (existing == null) 
{ 
    throw new InvalidOperationException("Cannot attach an entity that does not exist in the database."); 
} 

switch (entity.State) 
{ 
    case ObjectState.Modified: 
     GetEntry(existing).CurrentValues.SetValues(entity); 
     break; 

    case ObjectState.Deleted: 
     GetEntry(existing).State = EntityState.Deleted; 
     break; 
} 

这似乎并不导航性能工作了,所以我改变了代码如下所示:

var set = GetSet<TEntity>(); 
set.Attach(entity); 

// map object state to entity state 
switch (entity.State) 
{ 
    case ObjectState.Modified: 
     GetEntry(entity).State = EntityState.Modified; 
     break; 

    case ObjectState.Deleted: 
     GetEntry(entity).State = EntityState.Deleted; 
     break; 
} 

所有这一切需要改变为确保被连接的实体是一样的未来在实体 - 该BusinessUnit实体不也必须修改。