1

とにかく、質問のタイトルがわからない!仮想プロパティとして持つモデル クラスRandomStuffがあります。Environment

public class RandomStuff
    {
        //NOT SHOWN ON FORM HIDDEN JUST TO MAKE IT EASIER IN DB
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [Newtonsoft.Json.JsonProperty]
        public int JobId { get; set; }

        [Required]
        [ForeignKey("Environment")]
        [Newtonsoft.Json.JsonProperty]
        [DataMember(IsRequired = true)]
        public int EnvironmentId { get; set; }

        [Newtonsoft.Json.JsonProperty ]
        public virtual Environment Environment { get; set; }
}

私の環境は以下の通りです: -

[Newtonsoft.Json.JsonObject(Newtonsoft.Json.MemberSerialization.OptIn)]
    [DataContract]
    public class Environment
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [Newtonsoft.Json.JsonProperty]
        public int Id { get; set; }

        [Required]
        [Newtonsoft.Json.JsonProperty]
        [DataMember(IsRequired = true)]
        public string Name { get; set; }

    }

今、私のコントローラには次のものがあります:-

public HttpResponseMessage Save(RandomStuff stuff)
        {
            if (ModelState.IsValid)
            {
                //Some stuff here
                db.RandomStuffs.Add(stuff);//When this excutes, it is 
                                           //inserting data in Environment table also.
                db.SaveChanges();


            }
        }

さて、RandomStuffテーブルに何かを追加するたびに、環境も追加されます。

編集:

ef-inserting-duplicate-parent-objectsから取った一般的な例で説明しようと思います

public class Foo
{
    public int FooId {get;set;}
    public virtual ICollection<Bar> Bars {get;set;}
}

public class Bar
{
    public int BarId {get;set;}
    public strung BarName {get;set;}
}

さて、上記が私のモデル構造である場合。DB に 1 つの Foo データを追加しようとしています。

db.Foo.Add(new Foo{
                FooId=1, 
                Bars=new List<Bar>(){
                    new Bar{
                        BarId=2, 
                        BarName="Something"
                    }
                }
            })//Something of this sort will be my data, which needs to be inserted
          //Now this record "new Bar{BarId=2, BarName="Something"}" is already present in DB

ここで、id=1 の Foo テーブルにデータを挿入し、id 2 の Bars テーブルに複製を追加しています。

また、以下のようなものを使用すると、要件が満たされます。

db.Entry(fooModelDataComingFromSomewhere.Bars).State = EntityState.Unchanged;
4

1 に答える 1

1

問題が発生しているコードと同じ構造でさえない別の投稿からコードスニペットを提供しているため、質問はまだ明確ではありません。ただし、問題は挿入の重複にあると推測しているため、提案を試みます。

Add()Entity Framework DB コンテキストでメソッドを使用すると、アイテムがデータベースに既に存在する場合でも、接続されたオブジェクトのグラフ全体が追加済みとしてマークされます。あなたがおそらく見ている一般的な状況は、タイプのオブジェクトを追加すると、RandomStuffタイプの新しいオブジェクトも追加され、同じEnvironmentですが、データベースが割り当てられ、Entity Framework がグラフ全体を追加済みとしてマークしているため、同じで新しいを使用して、新しい Environment オブジェクトを作成します。したがって、テーブルには同じ を持つ複数の行があります。Environment.NameEnvironment.IdNameIdEnvironmentName

解決策は一見シンプルです。RandomStuffオブジェクトを表す外部キーを保持するためのプロパティが既にオブジェクトにあるため、グラフにEnvironment新しいオブジェクトを追加する代わりに、オブジェクトを作成しての値を追加するだけです。言い換えると、EnvironmentRandomStuffEnvironmentId

RandomStuffこの方法で新しいオブジェクトを作成する代わりに:

var RandomStuff randomStuff = new RandomStuff {
                                     Environment = new Environment {
                                                    Name = "Existing Environment"
                                                     }
                                     }

次のように作成します。

var RandomStuff randomStuff = new RandomStuff {
                                     EnvironmentId = existingEnvironment.Id
                                    }
于 2013-10-17T10:59:26.873 に答える