通过UserManager更新用户会清除导航属性

时间:2018-10-08 01:09:51

标签: asp.net-core .net-core

我有一个带有导航属性的用户类,该导航类充当多对多关系的联接模型。

例如:

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
}

0 个答案:

没有答案