Обновление пользователя через UserManager очищает свойство навигации - PullRequest
0 голосов
/ 08 октября 2018

У меня есть пользовательский класс со свойством навигации, которое действует как модель соединения для отношения «многие ко многим».

Например:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...