我有一个MVC 5应用程序,它使用默认身份验证。用户配置文件是我们模型的一部分,这意味着有几个类具有UserInfo的外键。有两个DbContext,一个用于模型,另一个用于UserInfo。
public class ApplicationDbContext : IdentityDbContext<UserInfo>
{
public ApplicationDbContext()
: base("Profile")
{
}
}
public class UserInfo : IdentityUser
{
public UserInfo ()
{
LibraryItems = new List<LibraryItem>();
if (UserGroup == UserGroupEnum.ANALYST)
{
Companies = new List<Company>();
}
DateCreate = DateTime.Now;
DateUpdate = DateTime.Now;
DateDelete = DateTime.Now;
}
[DisplayColumnInIndex]
[DisplayName("Is Active ?")]
public bool IsActive { get; set; }
[Timestamp]
public byte[] RowVersion { get; set; }
//[ValidateFile(ErrorMessage = "Please select a PNG image smaller than 1MB")]
//[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
[Editable(false, AllowInitialValue = true)]
public DateTime DateCreate { get; set; }
//[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
public DateTime DateUpdate { get; set; }
//[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
public DateTime DateDelete { get; set; }
[DisplayColumnInIndex]
public String Name { get; set; }
[DisplayColumnInIndex]
public String FirstName { get; set; }
[DisplayColumnInIndex]
public String Pseudo { get; set; }
[DisplayColumnInIndex]
public string PhoneNumber { get; set; }
[DisplayColumnInIndex]
public String Company { get; set; }
[DisplayName("Name_Id")]
[ForeignKey("FullName")]
public int? NameId { get; set; }
[DisplayColumnInIndex]
public UserGroupEnum UserGroup { get; set; }
[DisplayColumnInIndex]
public UserStatusEnum UserStatus { get; set; }
public virtual Name FullName { get; set; }
}
public class Comment
{
// more properties
[DisplayName("UserInfoId")]
[ForeignKey("UserInfo")]
public virtual String UserInfoId { get; set; }
}
public class Like
{
// more properties
[DisplayName("UserInfoId")]
[ForeignKey("UserInfo")]
public virtual String UserInfoId { get; set; }
}
我的userInfo还有第二个DBontext的其他表的外键。
设计我们的身份验证系统的最佳方式是什么?并保持这两个语境之间的关系。
提前谢谢。
我最近提出的解决方案是对ASP.NET身份数据和业务实体使用单一上下文:
public class DatabaseContext : IdentityDbContext<UserInfo>
{
public virtual DbSet<Comment> Comments { get; set; } // Your business entities
public DatabaseContext()
: base("name=DatabaseContext")
{
}
}
请注意,DatabaseContext
继承自IdentityDbContext<UserInfo>
。
这种方法有一些折衷:例如,您的数据访问层应该引用Microsoft.AspNet.Identity.Core
和Microsoft.AspNet.Identity.EntityFramework
;但是,如果您使用依赖项注入或实体框架迁移,那么在项目中使用单个数据库上下文会使事情变得更容易。