如何允许使用ASP.NET UserIdentity重新使用软删除的电子邮件

时间:2018-03-11 10:46:47

标签: asp.net-mvc soft-delete

我有一个ASP.NET应用程序,其中用户使用UserIdentity类进行身份验证。最近,我刚刚通过添加ActiveStatus'来实现了一个软删除功能。到ApplicationUser班。

如果用户无法将软删除的电子邮件地址重新注册为新帐户,则会出现此问题。有人可以帮我这个吗?

1 个答案:

答案 0 :(得分:0)

我刚刚使用2015年8月28日Rakesh Babu Paruchuri发布的https://www.codeguru.com/csharp/csharp/soft-deleting-entities-cleanly-using-entity-framework-6-interceptors.html的说明和示例代码,在我的MVC应用程序中实现了这一目标

该博客条目的示例代码链接为https://github.com/rakeshbabuparuchuri/EFExpensionPoints

如果这些链接不可用,这里的关键点是:

它使用自定义属性" SoftDeleteAttribute"使用实体框架拦截器。 我在自己的项目中包含的关键元素是:

  • 继承自System.Attribute
  • 的SoftDeleteAttribute的类
  • 继承自System.Data.Entity.Core.Common.CommandTrees.ExpressionBuilder.DefaultExpressionVisitor
  • 的SoftDeleteQueryVisitor类
  • 继承自System.Data.Entity.Infrastructure.Interception.IDbCommandTreeInterceptor
  • 的SoftDeleteInterceptor类

然后你注册拦截器 - 在我的例子中,我将以下代码放在与我的ApplicationDbContext相同的文件中(继承自IdentityDbContext):

public class ApplicationDbConfiguration : DbConfiguration
{
    public ApplicationDbConfiguration()
    {
        AddInterceptor(new Helpers.SoftDeleteInterceptor());
    }
}

重写OnModelCreating以添加处理SoftDeleteAttribute的约定:

 var conv = new AttributeToTableAnnotationConvention<SoftDeleteAttribute, string>(
    "SoftDeleteColumnName",
    (type, attributes) => attributes.Single().ColumnName);
  modelBuilder.Conventions.Add(conv);

最后一步是将SoftDeleteAttribute添加到我的ApplicationUser类。

[SoftDelete("IsDeleted")]
public class ApplicationUser : IdentityUser<int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>, IUser<int>
{
    //some code removed to emphasise the important bit

    [StringLength(150)]
    public string Forenames { get; set; }

    [StringLength(50)]
    public string Surname { get; set; }

    public bool IsDeleted { get; set; }

}

除此之外,我还删除并重新创建了数据库中users表的Username列的唯一索引,以便它使用条件以便我可以重用已删除用户的用户名(不推荐,但我使用的是现有数据库):

CREATE UNIQUE NONCLUSTERED INDEX [UserNameIndex] 
ON [dbo].[tbl_user] ([UserName] ASC) 
WHERE ([IsDeleted]=(0))

我也进行了一些迁移 - 我不确定迁移步骤是否对于让它发挥作用非常重要,我现在只是自己做了这个,所以没有机会尝试它针对手动创建的数据库。

通过这些更改,我可以软删除用户,然后使用相同的用户名和/或电子邮件地址创建新用户

我还在http://marisks.net/2016/02/27/entity-framework-soft-delete-and-automatic-created-modified-dates/找到了一个类似的解决方案,它也使用了命令拦截器,但是用固定的列名替换了SoftDelete属性,并且代码的排列方式略有不同。他还包括更新Created和Modified列以及软删除标志。那篇文章引用了拉克什的文章,它帮助我找到了它:)