删除通过linq抛出并发异常而不进行并发

时间:2017-11-03 14:12:35

标签: c# mysql linq

通过linq使用实体框架时,我从mysql数据库中删除数据,它是一个单线程程序,没有人正在使用db而不是我。每次我尝试通过以下方式删除实体:

private class ApplySchemaVendorExtensions : ISchemaFilter
{
    public void Apply(Schema schema, SchemaRegistry schemaRegistry, Type type)
    {
        if (schema.properties != null)
        {
            foreach (var p in schema.properties)
            {
                switch (p.Key)
                {
                    case "label":
                        p.Value.example = "Etichetta di esempio";
                        break;
                    case "value":
                        p.Value.example = "Valore di esempio";
                        break;
                }
                break;
            }
        }
    }
}

当我db.table.Remove(entity); 怎么可能时,它会引发并发异常?

2 个答案:

答案 0 :(得分:1)

试试这个:

try
{
    db.table.DeleteOnSubmit(entity);
    db.SubmitChanges();
}
catch(Exception e)
{
    Console.WriteLine(e);
    // Provide for exceptions.
}

答案 1 :(得分:0)

我在StackOverflow上找不到这个问题,所以我会发布解决方案,因为我自己发现了这个问题并且错误不会引导你找到解决方案:

如果您必须在foreach中执行操作,请使用数据库获取的结果列表,然后您必须删除结果

不要这样做:

List<Ducks> ducks = (from duck in db.Ducks select duck).ToList();
foreach (Ducks duck in ducks)
{
    //TODO
    db.Ducks.Remove(duck);
}
db.SaveChanges();

或者你会遇到并发错误。

您必须从他们的foreach中删除实体。

<强>解决方案:

List<Ducks> ducks = (from duck in db.Ducks select duck).ToList();
foreach (Ducks duck in ducks)
{
    //TODO
}
db.Ducks.RemoveRange(ducks);
db.SaveChanges();