如何在Identity项目使用EF Core和类库时使用EF6与同一数据库访问用户

时间:2017-02-10 21:22:45

标签: asp.net entity-framework asp.net-core entity-framework-6 entity-framework-core

我们有一个.NET Core项目,它使用Identity 3和IdentityDbContext,使用EF Core进行用户管理。生成的表存储在一个公共SQL服务器数据库中,该数据库也被我们的解决方案中的另一个项目使用,该解决方案是使用EF6的.NET 4.5.2 Framework DataLayer。

(还有一些背景 - .NET Core项目是一个授权服务器,它使用OpenIddict实现OpenIdConnect和Oauth2,并配置了Identity,以便我们可以将用户保存到数据库并登录和验证)

我们经过身份验证后,会调用API端点。 API与可与EF6一起使用的DataLayer进行通信。从这个项目我需要获取登录用户并与用户一起进行各种查询。理想情况下,我想使用和扩展相同的AspNetUsers表。

我想知道推荐的方法是什么?如果我尝试在EF6项目中生成User DbContext,我必须添加一个新的迁移,并且脚手架想要创建一个新表 - 一个已经存在于数据库中的表。我有点不确定在两个不同的项目中有两个单独的上下文,以及它们如何“一起玩得很好”。

2 个答案:

答案 0 :(得分:1)

我最近处理过类似的情况。我遵循这种方法。

我有一个单独的数据层类库,它具有与身份相关的存储库/存储,迁移和DbContext。 DbContext从主机项目获取连接字符串。

.Net Core项目在appSettings.json中指定了连接字符串。此连接字符串指向同一数据库。该项目实现IdentityServer3并充当令牌服务。

.Net 4.5.2项目在web.config中指定了连接字符串。这也指向同一个数据库。此应用程序从.net核心项目获取令牌,并使用Bearer Token访问其他API。

我创建了另一个项目来保留实体,并在.net core.net个主机中引用了这个项目。

这样,我有2个主机项目的公共数据层和2个主机项目的2个不同的服务/业务层。它对我很有用。

由于EF 7.0不支持播种,我有一个控制台应用程序,用于将数据播种到数据库中。甚至这个控制台应用程序也可以通过数据层访问同一个数据库。

所以3个不同的项目正在访问同一个数据库。

我无法与公众分享我的代码。我希望这会有所帮助。

答案 1 :(得分:1)

我能够让它发挥作用。主要问题是我只想访问我在DotNet 4.51 DataLayer类库项目中的DotNet Core项目中由Identity 3生成的AspNetUsers表。

我通过在类库EF 6项目中创建User.cs Entity类并确保它的属性与Identity 3生成的ApplicationUser.cs类中的列匹配来实现此目的。

User.cs

     public class User{

    [Key]
    public string Id { get; set; }
    public int AccessFailedCount { get; set; }
    public string ConcurrencyStamp { get; set; }
    public string Email { get; set; }
    public bool EmailConfirmed { get; set; }
    public bool LockoutEnabled { get; set; }
    public DateTimeOffset? LockoutEnd { get; set; }
    public string NormalizedEmail { get; set; }
    public string NormalizedUserName { get; set; }
    public virtual string PasswordHash { get; set; }
    public string PhoneNumber { get; set; }
    public bool PhoneNumberConfirmed { get; set; }
    public virtual string SecurityStamp { get; set; }
    public bool TwoFactorEnabled { get; set; }
    public string UserName { get; set; }
}

然后我设置了一个EntityConfiguration来映射到AspNetUsers表

UserConfiguration.cs

public class UserConfiguration : EntityTypeConfiguration<User>
{
    public UserConfiguration()
    {
        ToTable("AspNetUsers");
    }
}

在我的DbContext类中,我为我的Users实体添加了一个DbSet:

public virtual IDbSet<User> Users { get; set; }

然后我运行Add-Migration命令来支持更改。生成后,我注释掉了代码并将迁移应用到数据库中。这会在AspNetUsers表的__MigrationsHistory表中生成一行,但不会尝试重新创建表。

然后我能够成功地与DataLayer EF6项目中的AspNetUsers表交谈:)

似乎我现在也可以通过向User.cs类添加属性并在EF6 Datalayer项目中进行迁移来扩展带有自定义列的AspNetUsers表。