1

エンティティ フレームワークでの外部キー リレーションシップに問題があります。と の 2 つのテーブルがPersonsありCountriesます。Personsには への外部キー列がありCountryIdます。

テーブルはめったに変更されないためCountries、そのデータを一度だけフェッチし、を破棄し、キャッシュされDatabaseContextたリストをCountriesどこかに保持したいと考えています。これは私が問題に直面しているところです。

エンティティ フレームワークでは、データベース コンテキストを開き、必要に応じて行を追加/編集してから、データベース コンテキストを閉じる必要があるようです。開いた場合は、データをフェッチし、閉じます。その後、開いてデータを保存し、閉じます。それは問題があります。

したがって、私の POCO オブジェクトは次のようになります。

public class Country {
    public int CountryId {get; set; }
    public String Name {get; set; }
}

public Person {
    public int PersonId {get; set; }
    public virtual Country Country {get; set; }
}

次に、次のような新しい人を作成しようとします。

Country[] countries;
using (var dt = new DatabaseContext())
{
    countries= dt.Countries.ToArray();
}

Person person = new Person();
person.Country = countries[0];
using (var dt = new DatabaseContext()) { 
    dt.Entities.Add(person);
    dt.SaveChanges();
}

保存時に、エンティティ フレームワークはCountriesと同じ名前でテーブルに新しい行を作成しますcountries[0]が、ID は新しくインクリメントされます。これは明らかに望ましい結果ではありません。人物のCountry_CountryIdフィールドを の id に設定する必要がcountries[0]あり、新しい行を作成しないでください。

これを解決するにはどうすればよいですか?解決策の 1 つは、既に主キーが設定されているオブジェクトが与えられたときに、エンティティ フレームワークが新しい行を作成しないようにすることだと思います。これを行う方法はありますか?

4

2 に答える 2

3

これは数日おきに尋ねられる非常に一般的な問題であるため、問題を説明するためにかなりの努力をする前に、少なくともインターネットで少し検索するのではないかと思います。

Addメソッドは、エンティティグラフにすべてのエンティティを追加します。したがって、現在のコンテキストに接続countrypersoncountryいない場合は、を呼び出すAddと、との両方が挿入用の新しいエンティティとしてpersonマークされます。挿入されたくない場合は、EFに新しいエンティティではないことを伝える必要があります。personcountrycountrycountry

Person person = new Person();
person.Country = countries[0];
using (var dt = new DatabaseContext()) { 
    dt.Entities.Add(person);
    dt.Entry(person.Country).State = EntityState.Modified;
    dt.SaveChanges();
}
于 2012-04-16T10:44:12.993 に答える
1

DatabaseContextクラスに次の2つのメソッドを追加することで、この問題を解決しました。

public void Add(object target)
{
    this.Set(target.GetType()).Attach(target);
    this.Entry(target).State = System.Data.EntityState.Added;
}

public void Modify(object target)
{
    this.Set(target.GetType()).Attach(target);
    this.Entry(target).State = System.Data.EntityState.Modified;
}
于 2012-04-16T11:40:07.323 に答える