ASp.net Entity Framework多个身份用户实体

时间:2016-11-19 14:17:29

标签: c# asp.net entity-framework asp.net-identity

我目前正在重构为用户访问同一数据库的多个应用程序。每个都为用户添加自己的特殊属性,导致很多空值...我不喜欢这个。我的想法是每个应用程序使用一个自己的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实体。 我能做些什么来实现这一目标,或者有更好的方法来实现这一目标?

我的主要目标是使这个多个应用程序更加干净和分离,同时仍然所有应用程序都访问同一个数据库。

1 个答案:

答案 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);