我有一个带有导航属性的用户类,该导航类充当多对多关系的联接模型。
例如:
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
}