【问题标题】:EntityFramework 5 - Conflicting changes to the role 'x' of the relationship 'x' have been detected实体框架 5 - 已检测到关系“x”的劳力士更改冲突
【发布时间】:2013-10-16 15:52:44
【问题描述】:

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

    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

OwnerID = null

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

所有者 ID = 1

ProtectorID = null

我在标题中遇到错误,有人可以帮助我吗?

【问题讨论】:

  • 您也可以发布保护者和所有者实体吗?通常,当有一个属性引用回(在这种情况下)Animal 模型时,就会发生此错误。还要确保存在 ID 为 1 的所有者。
  • 更新了 Protector 和 Owner 模型。
  • 我暂时是空白的.. :|

标签: c# entity-framework entity-framework-5


【解决方案1】:

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

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

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

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

【讨论】:

  • 发生的情况是我只有一个上下文,一个Entity,它是Animal Entity,还有许多与之相关的foreign keys,唯一的方法,我发现到目前为止,它是Entity 关联null 并更新foreign entity ID,在Animal Entity 中,使用真实ID,在这种情况下Entity Framework 可以在不插入新实体的情况下更新。
  • 不过还是谢谢你,你并没有以任何方式批评我的回答……只是你的回答不能应用于我的问题。
【解决方案2】:

我发现了问题,在阅读此msdn post 后,我在思考并发现发生了什么,在我的存储库中,当我将更新我的实体时,我忘记将所有相关实体设置为 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;

【讨论】:

  • 这对我也有用。但是如果我想保持这种循环依赖呢?即,我希望将 oldAnimal.Owner 设置回 animal.Owner ?我有这样的要求。在接下来的步骤中,我将访问 oldAnimal 的所有者作为所有者对象本身。如果我将其设置为 null,我将无法访问它。有什么提示吗?告诉我。
猜你喜欢
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 2013-12-17
  • 1970-01-01
  • 2016-08-23
相关资源
最近更新 更多