3

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

    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 = null

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

所有者 ID = 1

保护者 ID = null

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

4

2 回答 2

5

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

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

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

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

于 2014-01-11T13:18:04.160 回答
3

我发现了问题,在阅读了这篇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;
于 2013-10-17T18:50:53.837 回答