我正在创建一个MVC 5应用程序并使用Identity Framework进行身份验证。 IdentityUser与内容实体具有一对多可选关系:
public class Content
{
public int Id { get; set; }
public string Title { get; set; }
public string CreatedById { get; set; }
public AppUser CreatedBy { get; set; }
}
public class AppUser : IdentityUser
{
public ICollection<Content> Contents { get; set; }
}
删除用户时我不希望删除子内容项,我希望将其CreatedByIds设置为null。如果我使用控制器中的以下代码
IdentityResult result = await UserManager.DeleteAsync(user);
我收到错误:
DELETE语句与REFERENCE约束冲突&#34; FK_dbo.Contents_dbo.AspNetUsers_CreatedById&#34;。冲突发生在数据库&#34; ApplicationDbContext&#34;,table&#34; dbo.Contents&#34;,column&#39; CreatedById&#39;中。 声明已经终止。
我通过在用户管理器中编写我自己的DeleteUserAsync实现来解决这个问题:
public async Task<int> MyDeleteUserAsync(AppUser user, IOwinContext context)
{
ApplicationDbContext db = context.Get<ApplicationDbContext>();
db.Users.Remove(db.Users.Include(u => u.Contents).Single(u => u.Id == user.Id));
return await db.SaveChangesAsync();
}
然后我从我的控制器那里打电话:
await UserManager.MyDeleteUserAsync(user, HttpContext.GetOwinContext());
这是有效的,因为它将内容加载到内存中,以便Entity Framework可以在保存之前将外键设置为null。
使用Entity Framework的UserManager的内置功能实现此目的的正确方法是什么?