【问题标题】:EF Delete Child CollectionEF 删除子集合
【发布时间】:2013-01-04 13:38:29
【问题描述】:

我有以下:

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;
}

但是没有人或城市被从数据库中删除。

【问题讨论】:

  • 你有没有得到一个城市?当你穿过时会发生什么?
  • 调试时发生了什么?你甚至进入 foreach 了吗?
  • 旁注:如果您使用First(),城市不能为空。当城市不存在时,它会抛出异常。你能回答上面的问题吗?
  • 你可以看看。它可能会给你提示:stackoverflow.com/questions/2468027/…

标签: c# entity-framework ef-code-first entity-framework-5


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2022-06-10
    • 2011-08-11
    • 1970-01-01
    相关资源
    最近更新 更多