0

我有一个SQL名为的表,它以多对多关系Person连接到表, .PetsPersonPets

我正在尝试Person使用Pets. 但我强迫 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 回答