如何在MVC5中创建两种类型的用户?

时间:2014-09-02 15:34:18

标签: asp.net asp.net-mvc entity-framework

我正在创建MVC5应用程序,并且我已经使用ASP.NET Identity来创建用户。所以,我已经拥有了AspNetUsers表,每当用户注册时,我都会在那里获得一个条目。我还有一个Admin角色,我手动指定哪个注册用户是管理员。另一方面,我还需要注册企业,就像普通用户一样,他们可以登录,注册和做一些事情。关键是他们将与普通用户有一些相似和不同的字段。例如,他们也会有,电子邮件地址,密码(我希望像普通用户一样进行哈希),电子邮件确认,唯一身份证等。但是他们有不同的字段以获取更多信息,例如他们的地址,邮编,普通用户不具备的国家,类别等。我怎样才能在MVC中实现这个目标?

我应该像ApplicationUser类那样做吗?

public class ApplicationUser : IdentityUser

我的意思是,我应该从IdendityUser继承我的商业模式吗?如果是,我的模型将如何知道IdentityUser中的哪个字段使用哪个字段?

以下是我目前的商业模式:

public class Business
{
    public int BusinessID { get; set; }

    public string BusinessName { get; set; }

    [ForeignKey("Category")]
    public int CategoryID { get; set; }

    public virtual Category Category { get; set; }

    [ForeignKey("Subcategory")]
    public int SubcategoryID { get; set; }

    public virtual Subcategory Subcategory { get; set; }

    public string BusinessAddress { get; set; }

    public string BusinessZip { get; set; }

    public string BusinessPhone { get; set; }

    public string BusinessDescription { get; set; }

    public string Facebook { get; set; }

    public string Twitter { get; set; }

    public byte[] ImageData { get; set; }

    public string ImageMimeType { get; set; }

    [Range(0.0, 5.0)]
    public double BusinessRating { get; set; }

    public virtual ICollection<Review> Reviews { get; set; }
}

因此,除了这些字段之外,我希望我的表格包含类似于AspNetUsers的内容,如Email,EmailConfirmed,PasswordHash,SecurityStamp等。

修改

请注意,商业模式中的某些字段是必需的。在下面你可以找到我的ApplicationUser类。

public class ApplicationUser : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
}

1 个答案:

答案 0 :(得分:2)

使用简单继承:

public class Business : ApplicationUser
{
    ...
}

您最终会在Discriminator表中找到AspNetUsers列,这将有助于实体框架识别它应该为行实例化哪个类(Business或{{1 }})。然后您可以正常查询,或者如果您只想要一种特定类型,则可以使用ApplicationUser

OfType<T>

注意:默认情况下,Entity Framework使用带有var businessUsers = db.Users.OfType<Business>(); 列的单个表处理简单继承。对于大多数情况,这可以正常工作,但是您必须记住,添加到基类的子类的任何属性都必须是可空的。您不能在数据库级别要求Discriminator DateTime之类的内容,因为那时您永远不能保存Business,而不是该属性。但是,这只是数据库级别的问题。您仍然可以使用视图模型从前端角度在ApplicationUser上创建特定属性。