1

我正在使用實體框架5數據庫的第一種方法。實體框架5多對多刪除依賴對象

我有一個現有的數據庫與這3個表:Person,Group,PersonGroup。這是爲了表達一對多的關係。一個人可以屬於多個團體。 PersonGroup表具有ID PersonId和GroupId。

表結構:

人:PERSONID,PERSONNAME

組:的GroupId,組名

PersonGroup:PERSONID,的GroupId

class diagram http://i39.tinypic.com/30jiluh.png

EF5添加了PersonGroup表作爲個人和團體實體的導航屬性。我想根據組名從組中刪除一個人。我仍然想保留這個人和小組。

如何在存儲庫中編寫此方法?下面是我有一個不工作

public bool RemovePersonFromGroup(Guid personId, string groupName) 
    { 

     using (gblPersonEntities gblPerson = new gblPersonEntities()) 
     { 
      var pg = gblPerson.Person 
       .Where(p => p.PersonId == personId).FirstOrDefault() 
       .Group.Where(g => g.GroupName == groupName).FirstOrDefault(); 

      //doesn't work because pg returns as a Group entity and 
      //remove is expecting a Person entity and I just want to remove a 
      //PersonGroup entity 
      gblPerson.Person.Remove(pg); 

      gblPerson.SaveChanges(); 
     } 
     return true; 
    } 

而且在這個項目中,所有的實體分離,不使用代理類型,其目的是WCF服務邊界之間移動。

+0

我不明白你的說法_EF5加入了PersonGroup表作爲導航屬性_。看起來你有一個多對多的關聯(不是一對多)Persons - Groups,這意味着你可以從一個Group的Persons集合中刪除一個Person。只有聯結記錄('PersonGroup')將被刪除。順便說一句,請你自己(和我們)幫忙收集屬性名稱並將其複數化。 –

+0

當我說「EF5已將PersonGroup表添加爲導航屬性」時,這是因爲當我從數據庫生成模型時,EF5將PersonGroup表添加爲Person實體上的導航屬性。我會編輯這個問題,使其更清晰。 – Que

+0

另外,你能告訴我刪除PersonGroup中的結合記錄的代碼嗎? – Que

回答

3

您從DB加載包含其組的人。然後,您從組的集合(而不是)中從上下文的組集合中刪除該組(這將從數據庫中刪除整個組)())。然後您致電SaveChanges。 EF會認識到,你已經從原來的人的組集合中刪除一個組,發送一個DELETE語句,而刪除PersonGroup表的連接記錄的數據庫:

public bool RemovePersonFromGroup(Guid personId, string groupName) 
{ 
    using (gblPersonEntities gblPerson = new gblPersonEntities()) 
    { 
     var person = gblPerson.Person 
      .Include(p => p.Group) 
      .Where(p => p.PersonId == personId) 
      .SingleOrDefault() 

     if (person != null) 
     { 
      var group = person.Group 
       .Where(g => g.GroupName == groupName) 
       .FirstOrDefault(); 

      if (group != null) 
      { 
       person.Group.Remove(group); 
       gblPerson.SaveChanges(); 
      } 
     } 
    } 
    return true; 
}