3

DB 内の既存のエンティティの更新に問題があります。Entity Framework Code First を使用しています。

私は計算食品を使った小さなプログラムを持っています。

私のドメインクラス>

public class Unit
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

public abstract class Item
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

public class Ingredient : Item
    {        
        public virtual Unit Unit { get; set; }               
        public decimal Price { get; set; }        
    }

public class Recipe : Item 
    {
        public virtual List<RecipeItem> Items { get; set; }
        public double WeightCoocked { get; set; }
        public bool IsAlsoIngredient { get; set; }        
    }

public class RecipeItem
    {
        public int Id { get; set; }
        public virtual Item Item { get; set; }        
        public int Quantity { get; set; }
    }

RecipeItem は Ingredient でも Recipe でもあることに注意してください。そのため、レシピをレシピに含めることができます。

この種の更新方法を試しました:

public void Update1(Recipe recipe)
        {            
            if (recipe == null) 
                return;                

            var originalRecipe = DataContext.Recipes.FirstOrDefault(i => i.Id == recipe.Id);

            if (originalRecipe == null) 
                return; 

            DataContext.Entry(originalRecipe).CurrentValues.SetValues(recipe);

            DataContext.SaveChanges();
        }

Update1 は機能しますが、コレクションが更新されません。

public void Update2(Recipe recipe)
        {            
            if (recipe == null) 
                return;                

            var originalRecipe = DataContext.Recipes.FirstOrDefault(i => i.Id == recipe.Id);

            if (originalRecipe == null) 
                return; 

            DataContext.Entry(originalRecipe).State = EntityState.Modified;

            DataContext.SaveChanges();
        }

Update1 は Update1 と同じように機能しますが、コレクションを変更すると例外が発生します。私もこの行を入れてみました

DataContext.Entry(originalRecipe.Items).State = EntityState.Modified;

最終更新方法>

public void Update3(Recipe recipe)
        {            
            if (recipe == null) 
                return;                

            var originalRecipe = DataContext.Recipes.FirstOrDefault(i => i.Id == recipe.Id);

            if (originalRecipe == null) 
                return; 

            DataContext.Recipes.Attach(recipe);
            DataContext.Entry(originalRecipe).State = EntityState.Modified;
            DataContext.Entry(originalRecipe.Items).State = EntityState.Modified;

            DataContext.SaveChanges();
        }

同じ例外を取得: 同じキーを持つオブジェクトが ObjectStateManager に既に存在します。ObjectStateManager は、同じキーを持つ複数のオブジェクトを追跡できません。

テーブル>ユニットと材料の更新には問題はありませんが、コレクションでは緊張します。私はすでにpluralsightでEFについてのビデオを見ましたが、私のような例はありません。

お手伝いありがとうございます。

4

2 に答える 2