来自不同DbContext的引用实体

时间:2019-06-05 21:50:45

标签: asp.net-core domain-driven-design asp.net-core-2.2

我将DbContext分为两部分:ApplicationContext(仅特定于域的实体)和IdentityContext(仅asp.net核心标识实体)。

但是,我需要向ApplicationUser实体(IdentityContext)添加一个外键,指向在ApplicationContext中创建的称为UserArea的实体。这样,我将拥有一个用于所有公司领域的表,而Aspnetusers表将具有一个引用UserArea.Id的列。

实现上下文的唯一方法是在上下文之间复制实体(在两个上下文中创建Area实体吗?

如何处理迁移的执行顺序,因为我可能有一个表取决于IdentityContext迁移,同时又有一个来自IdentityContext的表(取决于来自{{1 }}?

这里的整个想法是减少我的应用程序的域层与第三方资源(例如ApplicationContextEntity Framework)之间的耦合。

Identity

ApplicationUser类:

public class ApplicationContext : DbContext
{
    public virtual DbSet<UserArea> UserAreas { get; set; }
}


public class IdentityContext : IdentityDbContext<ApplicationUser>, IDisposable
{
    private readonly IConfiguration _configuration;

    public IdentityContext(DbContextOptions<IdentityContext> options, IConfiguration configuration)
        : base(options)
    {
        _configuration = configuration;
    }
    public DbSet<UserAudit> UserAuditEvents { get; set; }
}

UserArea类:

public class ApplicationUser : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime DateRegistered { get; set; }

}

1 个答案:

答案 0 :(得分:0)

将这两个DbContext作为单独的DbContext进行处理,它们之间没有任何关系。您可以使用手动分配的ID(GUID)来表示它们之间的关系。

想象一下第三方身份服务器和JWT身份验证(Auth0,Okta,IdentityServer)-因此,它基本上是IdentityDbContext的实现。后端将获得该用户的唯一标识符。请参阅:https://tools.ietf.org/html/rfc7519#section-4和子值。

您的数据库上下文必须具有:

  • 同样是User类-它具有唯一的ID(最好使用整数或顺序guid)和AuthID(这是JWT的子类),并根据您进行所有用户查找
  • UserArea对象(或数据库)-具有User.ID的FK或具有User.AreaID的对象,或者将存在NxN的三元表

无论如何,这应该进行必要的去耦。

现在可以创建用户了:

  • 您决定接受来自给定身份服务器的所有用户
  • 否则您将必须向用户添加一个布尔值:hasAccess标志,并确保在将用户对象添加到身份数据库(消息,带有重试的回调)时在数据库中创建了用户对象。