1

次のメソッドにより、FIRSTdb.SaveChanges()は例外をスローします:(セッションで実行されている他のスレッドがあるため、新しいトランザクションは許可されません。)

protected void btnInsertDependencies_Click(object sender, EventArgs e)
{
    using (icmsEntities db = new icmsEntities())
    {
        var divisions = db.Divisions;
        foreach (var division in divisions)
        {
            var dlc_sectors = db.Sectors.Where(s => s.Website.division_id == division.division_id).DistinctBy(s => s.name).ToList();
            foreach (var sector in dlc_sectors)
            {
                dlc_Sector dlc_sector = new dlc_Sector
                {
                    name = sector.name,
                    division_id = sector.Website.division_id
                };

                db.dlc_Sectors.AddObject(dlc_sector);

                var dlc_products = db.Products.Where(p => p.Sectors
                    .Any(s => s.Website.division_id == dlc_sector.division_id && s.name == dlc_sector.name))
                    .DistinctBy(p => p.name).ToList();

                foreach (var product in dlc_products.ToList())
                {
                    var dlc_product = db.dlc_Products.SingleOrDefault(p => p.name == product.name);
                    if (dlc_product == null)
                    {
                        dlc_product = new dlc_Product { name = product.name };
                        db.dlc_Products.AddObject(dlc_product);
                    }
                    dlc_product.dlc_Sectors.Add(dlc_sector);
                    db.SaveChanges();
                }
            }
        }
        db.SaveChanges();
    }
}

1つ目db.SaveChanges()は、同じ名前の新製品が再度挿入されないようにすることです。

どうすればこれを解決できますか?前もって感謝します。

私のために働いた:

                    var Local = db.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added)
                        .Where(es => es.Entity is dlc_Product).Select(es => es.Entity as dlc_Product);
                    var dlc_product = db.dlc_Products.SingleOrDefault(p => p.name == product.name)
                        ?? Local.SingleOrDefault(p => p.name == product.name);

ありがとう。

4

1 に答える 1

0

なぜこれが発生するのかはわかりませんが、次のコレクションSaveChanges()も確認した場合、最初の方法は必要ありません。Localdb.dlc_Products

foreach (var product in dlc_products.ToList())
{
   var dlc_product = db.dlc_Products.SingleOrDefault(p => p.name == product.name)
       ?? db.dlc_Products.Local.SingleOrDefault(p => p.name == product.name);
    ...
}

新しいオブジェクトがLocalコレクションに追加されます。

db.dlc_Products.Join(db.dlc_Products.Local)これはより効率的に見えますが、コンパイルされないことに注意してください。逆db.dlc_Productsに、呼び出しごとに全体を照会します。

于 2012-11-25T20:35:16.077 に答える