使用唯一索引保存相关实体

时间:2013-09-08 14:27:38

标签: c# sql entity-framework-5 foreign-key-relationship

我有一个名为SQL的{​​{1}}表,它与表Person连接,具有多对多关系,Pets

我正在尝试使用PersonPets保存实体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表中添加引用?

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分: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 >