エンティティ フレームワークでの外部キー リレーションシップに問題があります。と の 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 つは、既に主キーが設定されているオブジェクトが与えられたときに、エンティティ フレームワークが新しい行を作成しないようにすることだと思います。これを行う方法はありますか?