代码之家  ›  专栏  ›  技术社区  ›  Quoter

保存具有唯一索引的相关实体

  •  0
  • Quoter  · 技术社区  · 11 年前

    我有一个 SQL 名为的表 Person 它连接到桌子上 Pets 通过多对多关系, PersonPets .

    我正在尝试保存实体 具有 宠物 。但我强迫宠物的名字独一无二。

    它在中抛出了一个关于外键约束的异常 宠物 桌子这很好,我创建了那个索引。

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

    那么我该如何保存 与相关人员 宠物 如果它们已经存在,则不要再添加它们,只需在 人物宠物 桌子

    2 回复  |  直到 11 年前
        1
  •  1
  •   Slauma    11 年前

    您必须检查数据库中是否已经存在具有给定名称的宠物。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();
    }
    
        2
  •  0
  •   Robert Noack    11 年前

    你可以写一个查询来检查宠物的名字是否存在。

    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 >