我正在创建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;
}
}
答案 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
上创建特定属性。