У меня есть пользователи ASP.NET Core Identity, представленные следующим классом. Обратите внимание, что в обеих сущностях и обоих DTO, показанных здесь, я удалил ненужные свойства для ясности:
Код: Выделить всё
public class User : IdentityUser {
public int? CompanyId { get; set; }
public virtual Company? Company { get; set; }
}
Код: Выделить всё
public class Company {
public int Id { get; set; }
public virtual ObservableCollection Users { get; set; } = [];
}
Классы DTO выглядят следующим образом...< /p>
Код: Выделить всё
public class CompanyDto {
public int Id { get; set; }
public List Users { get; set; } = [];
}
public class UserDto {
public int? CompanyId { get; set; }
public string? CompanyName { get; set; }
}
Код: Выделить всё
public class AutoMapperProfile : Profile {
public AutoMapperProfile() {
CreateMap()
.ReverseMap();
CreateMap()
.ReverseMap()
// Next three rules to account for Identity storing the email four times
.ForPath(entity => entity.NormalizedEmail, opt => opt.MapFrom(dto => dto.Email.ToUpper()))
.ForPath(entity => entity.UserName, opt => opt.MapFrom(dto => dto.Email))
.ForPath(entity => entity.NormalizedUserName, opt => opt.MapFrom(dto => dto.Email.ToUpper()));
}
}
Код: Выделить всё
public async Task SaveCompany(CompanyDto company) {
if (company.Id == 0) {
context.Companies.Add(mapper.Map(company));
} else {
Company? dbCompany = await context.Companies
.Include(c => c.Users)
.SingleOrDefaultAsync(c => c.Id == company.Id);
if (dbCompany is not null) {
mapper.Map(company, dbCompany);
foreach (UserDto user in company.Users) {
User? dbUser = dbCompany.Users.SingleOrDefault(u => u.Id == user.ID);
if (dbUser is null) {
dbCompany.Users.Add(mapper.Map(user));
} else {
mapper.Map(user, dbUser);
}
context.Companies.Update(dbCompany);
}
}
}
await context.SaveChangesAsync();
}
Экземпляр типа сущности «Пользователь» невозможно отследить, поскольку другой экземпляр с тем же значением ключа для {'Id'} уже отслеживается. При присоединении существующих сущностей убедитесь, что присоединен только один экземпляр сущности с заданным значением ключа.
Это происходит, даже если в компании ничего не изменилось, или на пользователях, связанных с ним.
Я добавил следующий код, чтобы увидеть, что было в контексте, но ничего не было выведено, подразумевая, что контекст еще ничего не отслеживал. ..
Код: Выделить всё
context.ChangeTracker
.Entries()
.Where(x => includeUnchanged || x.State != EntityState.Unchanged)
.OrderBy(x => x.Entity.GetType().Name)
.ForEach(x => {
Console.WriteLine($"Entity ({x.Entity.GetType().Name}) has been {x.State.ToString()}");
});
Подробнее здесь: https://stackoverflow.com/questions/792 ... automapper
Мобильная версия