EF,Automapper 异常,"Attaching an entity of type ... failed because another entity of the same type already has the same primary key value"

EF, Automapper exception, "Attaching an entity of type ... failed because another entity of the same type already has the same primary key value"

我正在使用 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();

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

当状态设置为已修改时,出现以下异常;

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

是什么原因造成的,我该如何解决?

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

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

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

  1. 我们在 dbcontext 中加载了一个具有子对象 B 的对象 A,然后在 GUI 上使用了这些对象
  2. 当从 GUI 允许 post 时,我们用另一个数据库上下文加载了另一个对象 B'(与 B 具有相同的 PK),该对象仅用于验证参数的一些更改。
  3. 然后我们想通过将对象 A 和子对象 B 附加到 dbcontext 来将对象 A 和子对象 B 保存到数据库中,但是随后发生了错误。

发生错误是因为,除了对象 B' 之外,已经有一个具有相同 PK 的对象 B,源自另一个数据库上下文。

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

  1. 正在重新获取对象 A 及其子对象 B,然后从 GUI 模型设置所有属性,然后将其刷新到数据库中。
  2. 我们不再:附加 GUI 模型(来自先前 dbcontext 的对象 A 和 B)
  3. 我们不再单独获取对象 B。

在您的代码中: 对象 属性 是否已作为对象 [=24 的子对象加载? =]src 然后自动映射到对象 属性 并因此添加到上下文,然后将通知具有相同 pk 的对象类型 ?

在这里我找到了一个类似的post

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

Mapper.Map(src, property);

关于实体状态垃圾的生意很少能成功。相反,将 DTO 中的值映射到 EF 返回的实体中。