我目前正在重构为用户访问同一数据库的多个应用程序。每个都为用户添加自己的特殊属性,导致很多空值...我不喜欢这个。我的想法是每个应用程序使用一个自己的IdentityUser,dbContext和UserManager。 有一个基本的IdentityUser,其他的派生自它。它看起来像这样:
基本用户:
public class User : IdentityUser
{
public string Username {get;set;}
public string Email {get;set;}
...
}
此用户的dbContext和userManager:
public class UserAuthenticationDbContext : IdentityDbContext<User>
{
//code here
}
public class UserManager : UserManager<User>
{
//code here
}
对于第二个用户,我执行了以下操作:
[Table("User2")]
public class User2 : User
{
public string SpecialProperty1 {get;set;}
public string SpecialProperty2 {get;set;}
}
public class User2Manager : UserManager<User2>
{
// code here
}
public class User2AuthenticationDbContext : IdentityDbContext<User2>
{
//code here
}
User2表仅具有两个属性。 User2中的主键与用户表中的主键相同,也是FK中的主键。
在asp.net mvc Project中,我仅使用User2相关类。如果我现在启动此应用程序,我立即收到错误消息&#34;无效的列名称SpecialProperty1和SpecialProperty2&#34;。 实体框架似乎访问没有此附加字段的用户表。它没有&#34;合并&#34;它与User2表一起返回User2实体。 我能做些什么来实现这一目标,或者有更好的方法来实现这一目标?
我的主要目标是使这个多个应用程序更加干净和分离,同时仍然所有应用程序都访问同一个数据库。
答案 0 :(得分:0)
您需要拥有的是:
XYZ.Business.Enities.DLL (Class Library)
- 您定义用户类的位置:
class BaseUser
class User1 : BaseUser
class User2 : BaseUser
etc
XYZ.Infrastructure.DataRepository.DLL (Class Library)
- 您的数据仓库,您将拥有以下内容:
public IDbSet<BaseUser> Users
基于该DLL,您可以生成数据库模式(Ef代码优先)。您将拥有一个带有Discriminator
列的Users表(可能的类型:BaseUser,User1,User2等)。
您的应用程序应引用相同的常见Entities
程序集。在每个应用程序中使用特定用户类型。
e.g。
App1的:
User1 user = new User1();
this.dataRepository.Users.Add(user);
App2的:
User2 user = new User2();
this.dataRepository.Users.Add(user);
App3的:
var users = this.dataRepository.Users.Where(user is User3)
重点是......您的不同应用程序应引用相同的实体和存储库DLL。
也许在您的DataRepository
之上,您可以构建一个通用的用户仓库,它可以执行。
public class UserRepository<T> where T : BaseUser
{
public UserRepository(IDataRepository dataRepository)
{
}
// ... expose underlying dataRepository.Users here, while enforcing the T
}
然后你就可以进入你的应用程序了:
var userRepo = new UserRepository<User1>(this.DataRepository);