1

我正在使用 Entity Framework 5 数据库优先方法。

我有一个包含这 3 个表的现有数据库:Person、Group、PersonGroup。这是为了表达一对多的关系。一个人可以属于多个组。PersonGroup 表具有 ID PersonId 和 GroupId。

表结构:

人员:PersonId、PersonName

组:GroupId、GroupName

PersonGroup:PersonId、GroupId

类图

EF5 已将 PersonGroup 表添加为 Person 和 Group 实体的导航属性。我想根据组名从组中删除一个人。我仍然想保留这个人和这个团体。

如何在存储库中编写此方法?这就是我所拥有的不起作用

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 服务边界之间移动。

4

1 回答 1

3

您从数据库加载包含其组的人员。然后,您从该人的组集合中删除该组(而不是从上下文的组集中(这将从数据库中删除整个组))。然后你打电话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;
}
于 2013-10-01T19:35:01.927 回答