Используемое исключение Automapper: экземпляр типа сущности не может быть отслежен, потому что другой экземпляр с ключом уже отслеживается - PullRequest
0 голосов
/ 08 июня 2018

Я использую ASP.NET Core с EFCore 2.0.3 и Automapper 6.2.2

Вот моя модель:

    public class StudentClass
    {
        public int Id { get; set; }
        public int ClassId { get; set; }
        public Class Class { get; set; }
        public int ProfId { get; set; }
        public Professor Prof { get; set; }
        public string Description { get; set; }
        public DateTimeOffset LastUpdateTime { get; set; }
        public DateTimeOffset CreateTime { get; set; }
    }

И моя сущность

    public class StudentClassEntity
    {
        public int Id { get; set; }

        public int ClassId { get; set; }
        [ForeignKey("ClassId")]
        public virtual Class Class { get; set; }
        public int ProfId { get; set; }
        [ForeignKey("ProfId")]
        public Professor Prof { get; set; }
        public string Description { get; set; }
        public DateTimeOffset LastUpdateTime { get; set; }
        public DateTimeOffset CreateTime { get; set; }
        public virtual List<Task> Tasks { get; set; }
    }

И я попытался обновить StudentClass Так вот мой пример метода:

        public void Update()
        {

            var studentclass = new StudentClass();
            studentclass.Id = 7;
            studentclass.CreateTime = System.DateTimeOffset.MinValue;
            studentclass.Description = $"new desc - {System.DateTime.Now.Millisecond}";
            studentclass.ProfId = 5;
            studentclass.ClassId = 7;


            var entity = _context.StudentClasses.FirstOrDefault(x => x.Id == studentclass.Id);

            if (entity != null)
            {
                entity = _mapper.Map<StudentClassEntity>(studentclass);
                _context.StudentClasses.Update(entity);
                _context.SaveChanges();
            }
        }

И моя карта Automapper:

 CreateMap<StudentClass, StudentClassEntity>()
 .ForMember(m => m.Description, o => o.MapFrom(x => x.Description))
 .ForMember(m => m.LastUpdateTime, o => o.MapFrom(f => DateTimeOffset.Now))
 .ForAllOtherMembers(m => m.UseDestinationValue());

Итак, я получил исключение:

The instance of entity type cannot be tracked because another instance with the key value "Id:7" is already being tracked.

Но если вместо использования Automapper я просто сопоставлю вручную:

if (entity != null)
{
     //entity = _mapper.Map<StudentClassEntity>(studentclass);
    entity.Description = studentclass.Description;
    entity.LastUpdateTime = DateTimeOffset.Now;

    _context.StudentClasses.Update(entity);
    _context.SaveChanges();
}

Будет обновлена ​​БД без исключения.В чем проблема?Я что-то пропустил?Как создать карту в Automapper для обновления сущности без исключения?

1 Ответ

0 голосов
/ 08 июня 2018

Я обнаружил, что если я использую

entity = _mapper.Map<StudentClassEntity>(studentclass);

, Automapper создаст новый объект для сущности, и, очевидно, это не та же ссылка в контексте.Но если я использовал

_mapper.Map(studentclass, entity);

Automapper не создает новый экземпляр, и сущность является той же ссылкой, что и в контексте.

...