如何删除ASP.NET Identity中与其他实体具有可选关系的用户

时间:2016-10-27 23:00:31

标签: c# asp.net-mvc entity-framework asp.net-identity

我正在创建一个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的内置功能实现此目的的正确方法是什么?

0 个答案:

没有答案