EF,Automapper例外,“附加类型的实体...失败,因为同一类型的另一个实体已经具有相同的主键值”

时间:2015-08-05 11:19:24

标签: c# entity-framework automapper

我正在使用automapper重构一些代码,请参阅下面的旧代码注释掉。

var propertyInUse = context.Properties.FirstOrDefault(j => j.ID != src.PropertyId && j.UPRN.ToLower() == src.UPRN.ToLower() && j.ContractId == src.ContractId);

if (propertyInUse == null)
{
    var property = context.Properties.FirstOrDefault(j => j.ID == src.PropertyId);

    if (property != null)
    {
        if (src.PropertyTypeId == 0)
        {
            src.PropertyTypeId = null;
        }

        src.Created = property.Created;
        src.CreatedBy = property.CreatedBy;
        src.ContractId = property.ContractId;

        Mapper.CreateMap<Job, Property>();
        property = Mapper.Map<Property>(src);
        //property.PropertyNo = src.PropertyNo;
        //property.BlockName = src.BlockName;
        //property.StreetName = src.StreetName;
        //property.AddressLine2 = src.AddressLine2;
        //property.AddressLine3 = src.AddressLine3;
        //property.AddressLine4 = src.AddressLine4;
        //property.Postcode = src.Postcode;
        //property.Latitude = src.Latitude;
        //property.Longitude = src.Longitude;
        //property.BlockUPRN = src.BlockUPRN;
        //property.Comments = src.Comments;
        //property.NumberOfBathrooms = src.NumberOfBathrooms;
        //property.NumberOfBedrooms = src.NumberOfBedrooms;
        //property.NumberOfKitchens = src.NumberOfKitchens;
        //property.LastModifiedby = src.LastModifiedby;
        property.LastModified = DateTime.Now;
        context.Entry(property).State = EntityState.Modified;
        success = true;
        context.SaveChanges();

编辑:请注意,属性对象是从基础设置的,因此建议的重复问题不适用。

当状态设置为modified时,我得到以下异常;

附加“M.Survey.ServiceLayer.Model.Property”类型的实体失败,因为同一类型的另一个实体已具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新的并且尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“已添加”实体状态来跟踪图表,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。

导致此问题的原因以及如何解决?

3 个答案:

答案 0 :(得分:2)

您是否尝试过映射到现有对象?

Mapper.Map(src, property);

关于实体国家垃圾的业务很少能正常运作。而是将DTO中的值映射到EF返回的实体。

答案 1 :(得分:0)

我认为你应该忽略主键属性映射。 什么是Property模型的主键?

答案 2 :(得分:0)

查看错误消息: 附加失败,因为同一类型的另一个实体已具有相同的主键值。

我们过去也遇到过这个问题:

  1. 我们在dbcontext中加载了一个具有子对象B的对象A,然后在GUI上使用了这些对象
  2. 当允许来自GUI的帖子时,我们加载了另一个对象B'(与B具有相同的PK)和另一个数据库上下文,该对象仅用于验证参数的某些更改。
  3. 然后我们希望将带有子对象B的对象A通过将其附加到dbcontext来保存到数据库,但随后发生了错误。
  4. 发生错误是因为,除了对象B'之外,已经存在具有相同PK的对象B,源自另一个数据库上下文。

    我们通过避免在一个dbcontext中使用相同对象类型的重复键解决了这个问题:

    1. 重新绘制对象A和他的子对象B,然后从GUImodels设置所有属性,然后将其刷新到数据库。
    2. 我们不再:附加了GUImodels(以前的dbcontext中的对象A和B)
    3. 我们不再单独提取对象B.
    4. 在您的代码中:对象属性是否已从对象 src 加载为子对象,然后自动映射到对象属性并因此添加到上下文中,然后将使用相同的pk通知对象类型?

      我在这里找到了类似的post