我们有一个.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,我必须添加一个新的迁移,并且脚手架想要创建一个新表 - 一个已经存在于数据库中的表。我有点不确定在两个不同的项目中有两个单独的上下文,以及它们如何“一起玩得很好”。
答案 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表。