0

このコードを実行すると、次のように表示されます。

Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.

ここの状況は想像できます。おそらくこれが原因です:

//Default.aspx.cs
MyEntity cont = new MyEntity();
IEnumerable<Product> p = from c in cont.Products.AsEnumerable()
                select c;
Product example = p.ToArray()[0];
example.Delete(); // This Delete method is an extension method which you'll see in below.
//I also have some other stuff like

IEnumerable<Category> cc = from n in cont.Categories.AsEnumerable()
                                 select n;
cont.Categories.Remove(cc.ToArray()[0]);
cont.SaveChanges(); //throws the error

これが拡張メソッドの主要部分です

public static bool Delete(this Product pro,bool SetNull = false) {
    using (var en = new MyEntity()) {
        IEnumerable<Product> s = from ss in en.Products
                                where ss.ID == pro.ID
                                select ss;

        en.Products.Remove(s.SingleOrDefault());
        en.SaveChanges();
    }
}

拡張メソッドが機能し、エンティティがデータベースから削除されます。しかし、プログラムが来ると

cont.SaveChanges();

行、それはエラーをスローします。別の MyEntity() クラスを使用して別のメソッド内のエンティティを変更したため、このエラーが発生したと思います。だから私は他のものをリフレッシュする方法を見つけるために検索しました。しかし、私はできませんでした...

4

2 に答える 2

4

コンテキストをパラメーターとして delete メソッドに渡す必要があると思います。メソッドで新しいコンテキストを構築せず、そこから削除します。代わりに、元のコンテキストから削除してください。

于 2013-06-26T11:02:02.570 に答える
0

私は、オマー・シュライファーのアドバイスと、別のトピックで見つけたものを使用して、それを理解しました。

セッション LINQ To Entity で他のスレッドが実行されているため、新しいトランザクションは許可されません

delete メソッドでコンテキストをパラメーターとして使用しましたが、エラーがスローされました

New transaction is not allowed because there are other threads running in the session

そして、使用する for ループを次のように変更しました

foreach (Product m in p.ToList())
{
}

これの代わりに

foreach (Product m in p)
{
}

そして問題は解決しました。

ご回答ありがとうございます...

于 2013-06-26T14:10:26.423 に答える