0

SQLという名前のテーブルがあり、多対多の関係を持つテーブルにPerson接続されています。PetsPersonPets

Personでエンティティを保存しようとしていますPets。しかし、私はペットの名前を一意にするよう強制しました。

テーブルの外部キー制約に関する例外をスローしPetsます。それは良いことです、私はそのインデックスを作成しました。

public class Person
{
  public string Name { get; set; }
  public string LastName { get; set; }
}

public class Pets
{
  public string Name { get; set; }
}

Personでは、関連するものを保存するにはどうすればよいでしょうか。それらが既に存在する場合は、それらを再度追加するのではなく、テーブルPetsに参照を追加するだけですか?PersonPets

4

2 に答える 2

1

指定された名前のペットがデータベースに既に存在するかどうかを確認する必要があります。EF はそれを自動的に行いません。すべてのペットに対して単一のクエリでこのチェックを実行し、person.Petsコレクション内で見つかったペットをロードされた既存のペットに置き換えることができます。

Person person... // your new person with a collection of pets

using (var ctx = new MyContext())
{
    var pets = person.Pets;
    var petNames = pets.Select(p => p.Name);
    person.Pets.Clear();

    var existingPetsDict = ctx.Pets
        .Where(p => petNames.Contains(p.Name))
        .ToDictionary(p => p.Name);

    foreach (var pet in pets)
    {
        Pets existingPet;
        if (existingPetsDict.TryGetValue(pet.Name, out existingPet))
            person.Pets.Add(existingPet);
        else
            person.Pets.Add(pet);
    }

    ctx.Persons.Add(person);
    ctx.SaveChanges();
}
于 2013-09-08T14:54:37.627 に答える
0

ペット名が存在するかどうかを確認するクエリを作成できます。

Person person;
< code to init. person with your values >

string myPet = <the input pet name>
var pet = (from p in Pets where p.Name == myPet).FirstOrDefault();

if (pet == null) {
    < code to insert new Pet >
    Pet pet = new Pet();
    pet.Name = myPet;
}

person.Pets.Add(pet);


< code to attach Person / save changes >
于 2013-09-08T14:39:39.773 に答える