【问题标题】:What is the best way to integrate Identity with my app database?将 Identity 与我的应用程序数据库集成的最佳方式是什么?
【发布时间】:2018-12-10 23:49:53
【问题描述】:

我正在学习 Asp.net Core 和 Entity Framework Core,并使用代码优先方法创建了一个基本的 Web 应用程序。我的应用程序有一个上下文 (AppContext),为了使用 Identity,我定义了一个新的上下文 (IdentityContext),它使用相同的数据库。 我想将每个身份的用户(来自 IdentityContext 的 AppUser)与一个员工(来自 AppContext)相关联,但是当我尝试它时,EF Core 会为它创建一个新表。

public class AppUser : IdentityUser
{
    public Employee Employee { get; set; }
}

public class Employee
{
    public long Id { get; set; }
    public string AspNetUserId { get; set; }
    public AppUser AppUser { get; set; }
}

应用上下文

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Employee>(employee =>
        {
            employee.HasIndex(e => e.AspNetUserId);
            employee
                .HasOne(e => e.AppUser)
                .WithOne(au => au.Employee)
                .HasForeignKey<Employee>(e=>e.AspNetUserId);
        });
    }

我对此有很多疑问:

  1. 我认为有两个独立的上下文是可以的,每个上下文只有一个关注点。可以吗?还是应该将我的 AppContext 复制粘贴到 IdentityContext 上?
  2. 如何告诉我的 AppContext 没有为 AppUser 创建新表,而是使用 IdentityContext 创建的表?
  3. 还有其他选择吗?

任何建议或参考将不胜感激。

谢谢。

【问题讨论】:

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


    【解决方案1】:

    我认为有两个单独的上下文是可以的,每个上下文都有一个 一个问题。可以吗?或者我应该将我的 AppContext 复制粘贴到 身份上下文?

    完全没问题。问题是您想将它们分开,但又不能让它们有自己的顾虑。

    您当前告诉您的 IdentityContext 它应该同时具有 AppUser 和 Employee,并且它们之间存在关系。然后上下文会照顾他们两个,除非你明确告诉它不要。但是现在你明确告诉它。

    几乎可以总结为这个简单的规则:分离的上下文 -> 分离的数据。

    如何告诉我的 AppContext 没有为 AppUser,并使用由 IdentityContext 创建的表?

    你真的不应该。不要期望实体框架处理上下文之间的关系。它几乎不会。如果您的实体具有连接,则它们属于同一上下文。您可以将其视为不同的数据库。在两个不同的数据库之间进行查询并不是那么顺利。

    但是,您仍然可以将它们分开,方法是告诉配置忽略引用的实体,如下所示:

    modelBuilder.Entity<AppUser>().Ignore(e => e.Employee);
    

    但是,这可能只会让人感到困惑,因为除非您自己做,否则这些实体不会被跟踪或映射。因此,我建议要么坚持使用 Id 作为参考/外键,让他们过自己的生活,要么将它们结合起来并执行你当前的计划。如果您是游戏新手,我建议您坚持一种情况。

    还有其他选择吗?

    我喜欢为身份分离一个上下文的想法,因为其中的一些逻辑可能与 UI 层相关,而且实际上很少需要对用户上的其他实体进行任何引用。它确实在迁移等方面付出了一些额外的努力,但总的来说它工作得很好。您仍然可以通过一些简洁的通用方法和接口轻松获取属于用户的相关实体。

    但如果我的实体少于 15-20 个,我什至不会这样做。这不值得。这么小的项目收益还是太少了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-22
      • 2020-04-28
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 2015-07-31
      • 1970-01-01
      相关资源
      最近更新 更多