我有一个名为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
表中添加引用?
答案 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 >