У меня есть пользовательский класс со свойством навигации, которое действует как модель соединения для отношения «многие ко многим».
Например:
class User
{
public string Id { get; set; }
public ICollection<UserFoo> Foos { get; set; }
}
class UserFoo
{
public string UserId { get; set; }
public User User { get; set; }
public int FooId { get; set; }
public Foo Foo { get; set; }
}
class Foo
{
public int Id { get; set; }
public ICollection <UserFoo> Users { get; set; }
}
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<UserFoo>
.HasOne(uf => uf.User)
.WithMany(u => u.Foos)
.HasForeignKey(uf => uf.UserId);
builder.Entity<UserFoo>
.HasOne(uf => uf.Foo)
.WithMany(u => u.Users)
.HasForeignKey(uf => uf.FooId);
}
При обновлении пользователяс классом UserManager
он проявляет странное поведение со свойством навигации.
Когда я впервые добавляю некоторые отношения с пользователем, он обновляется нормально, как и следовало ожидать.
В любой последующий разЯ делаю изменения, вот когда все становится странным.Если у пользователя есть ссылка на FooA и FooB, добавление ссылки на FooC приведет к удалению FooA и FooB, что приведет только к FooC.Если у пользователя есть ссылка на FooA и FooB, удаление любой из них удаляет все ссылки.
Странное состояние возникает после вызова UserManager.UpdateAsync
- переданная ему модель пользователя находится в правильном состоянии перед вызовом,и неправильный после завершения вызова.
Я проследил это до внутреннего вызова на Store.UpdateAsync
.Я не могу понять, куда идти дальше, кроме перехода на использование контекста для обновления пользователя.
Метод обновления (отрезанный):
public IActionResult Update(string id, UserForm form)
{
// form in correct state
var user = userManager.Users.Include(u => u.Foos).FirstOrDefault(u => u.Id == id);
// user in correct state
var role = await roleManager.FindByIdAsync(form.RoleId);
mapper.Map(form, user); // AutoMapper
// user now in correct state after mapping
var result = await userManager.UpdateAsync(user, role, form.Password);
// user in incorrect state
}