实体框架 5 - 检测到关系“x”的角色“x”的冲突更改

本文关键字:角色 冲突 框架 关系 实体 检测 | 更新日期: 2023-09-27 18:35:34

我有这个模型(动物模型):

    public int Id { get; set; }
    public int AnimalSpecieId { get; set; }
    public int AnimalBreedId { get; set; }
    public Nullable<int> ProtectorId { get; set; }
    public Nullable<int> OwnerId { get; set; }
    public string Name { get; set; }
    public virtual Owner Owner { get; set; }
    public virtual Protector Protector { get; set; }

保护器型号:

    public int Id { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public string Phone { get; set; }
    public string CellPhone { get; set; }
    public string Email { get; set; }
    public virtual ICollection<Animal> Animals { get; set; }

业主模型:

    public int Id { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public string Phone { get; set; }
    public string CellPhone { get; set; }
    public string Email { get; set; }
    public virtual ICollection<Animal> Animals { get; set; }

当我第一次插入这个模型时,如果

保护者 ID = 1

所有者 ID = 空

没关系,但是,我尝试更新此模型,更改为:

所有者 ID = 1

保护程序 ID = 空

收到标题错误,有人可以帮助我吗?

实体框架 5 - 检测到关系“x”的角色“x”的冲突更改

我不同意上面的答案。我不确定它是否永久解决了您的问题,因为该问题与空值分配无关。实际原因与DBContext有关。当我们进行任何SaveChanges时,需要正确调度上下文,以便继续下一个SaveChanges,使用不同的外键将另一条记录插入同一项目的数据库中。您只需要在" context.SaveChanges() "之后添加以下行

context.Entry(your object).State = System.Data.Entity.EntityState.Detached;

这将解决冲突。具有相同上下文的多次插入会导致冲突。

如果我的评论以任何方式批评了您的回答,请道歉。

我发现了问题,在阅读了这篇 msdn 帖子后,我在思考并发现了发生了什么,在我的存储库中,当我更新我的实体时,我忘记将所有相关实体设置为 null。

旧代码:

var oldAnimal = context.Animals.Find(animal.Id);
if (oldAnimal != null)
{
    oldAnimal.AnimalBreed = context.AnimalBreeds.Find(animal.AnimalBreed.Id);
    oldAnimal.AnimalSpecie = context.AnimalSpecies.Find(animal.AnimalSpecie.Id);
    oldAnimal.OwnerId = animal.OwnerId;
    oldAnimal.ProtectorId = animal.ProtectorId;
    oldAnimal.Castrated = animal.Castrated;
    oldAnimal.DateBirth = animal.DateBirth;
    oldAnimal.Gender = animal.Gender;
    oldAnimal.Name = animal.Name;
    oldAnimal.UpdateDate = DateTime.Now;
    oldAnimal.Vaccinated = animal.Vaccinated;
    oldAnimal.Weight = animal.Weight;
}
context.SaveChanges();
return animal;

新代码:

var oldAnimal = context.Animals.Find(animal.Id);
if (oldAnimal != null)
{
    oldAnimal.AnimalBreed = context.AnimalBreeds.Find(animal.AnimalBreed.Id);
    oldAnimal.AnimalSpecie = context.AnimalSpecies.Find(animal.AnimalSpecie.Id);
    oldAnimal.Owner = null;
    oldAnimal.Protector = null;
    oldAnimal.OwnerId = animal.OwnerId;
    oldAnimal.ProtectorId = animal.ProtectorId;
    oldAnimal.Castrated = animal.Castrated;
    oldAnimal.DateBirth = animal.DateBirth;
    oldAnimal.Gender = animal.Gender;
    oldAnimal.Name = animal.Name;
    oldAnimal.UpdateDate = DateTime.Now;
    oldAnimal.Vaccinated = animal.Vaccinated;
    oldAnimal.Weight = animal.Weight;
}
context.SaveChanges();
return animal;