EF 删除子集合。

4

我有以下内容:

class City {
    int id;
    string Name;
    ICollection<Person> Persons;
}

class Person {
   int id;
   string Name;
}

什么是正确的删除城市及其相关联系人的方法?可能我想避免外键约束并手动处理。 我已经尝试过:

public bool Delete(int id // City Id)
{
    City city = _db.Cities
                .Include(c => c.Persons)
                .First(c => c.Id == id);
    if(city != null)
    {
        foreach (Person person in city.Persons)
        {
            _db.Persons.Remove(person);
        }

        _db.Cities.Remove(city);

        _db.SaveChanges();
        return true;
    }

    return false;
}

但是没有任何个人或城市被从数据库中移除。


1
你有任何城市吗?当你步进时会发生什么? - Gaz Winter
当你进行调试时,发生了什么?你是否进入了foreach循环? - Corey Adler
1
旁注:如果您使用 First(),城市不能为空。当城市不存在时,它会抛出异常。您能回答上面的问题吗? - Gert Arnold
你可以看一下这个链接,它可能会给你一些提示: http://stackoverflow.com/questions/2468027/entity-framework-delete-object-and-its-related-entities - sachin
1个回答

1

你的代码看起来是正确的...

你也可以尝试使用以下代码删除实体:

foreach (Person person in city.Persons)
{
    _db.Persons.Entry(person).State = EntityState.Deleted;
}

_db.Cities.Entry(city).State = EntityState.Deleted;

_db.SaveChanges();

还有一件事...

如果您使用First来获取City,那么if语句将始终为true,因为First期望有一个匹配项,并且当源序列为空时,它会抛出InvalidOperationException异常。

从您的代码中可以看出,如果通过id找到了匹配项并执行了删除,则该方法返回true,如果没有找到匹配项,则返回false。要使citynull,您应该使用FirstOrDefault,它返回处理的类型的默认值(在您的情况下为null),如果源序列为空。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接