同一个数据库中的两个IdentityDbContext

本文关键字:两个 IdentityDbContext 数据库 同一个 | 更新日期: 2023-09-27 18:15:53

我有一个web api。我希望它有两种类型的用户。他们完全没有关系。

如何管理两者的身份验证?

我不想将它们放在同一个表中,并将它们的类型管理为role,因为它们是不同的实体。一种用户由人类使用,另一种用户由服务使用。它们有不同的类和属性。我想有像两个IdentityDbContext的东西,但我想在同一数据库中维护所有。你觉得有可能吗?

同一个数据库中的两个IdentityDbContext

我不确定这是否是一个好的做法,但您可以使用不同的模式,如:

[dbo]。UserProfile和[webapi]。UserProfile

据我所知,你正在使用ASP。并使用空项目附带的默认IdentityDbContext。

它使用CodeFirst方法在数据库上创建表。你只需要创建另一个你需要的,并配置它使用不同的模式。

编辑-示例

的通知(表("UserProfile"模式= "dbo")]和[表("UserProfile"模式= "webapi")]

这样EF会注意到你试图从不同的表中获取数据。

[Table("UserProfile", Schema = "dbo")]
public class UserProfile
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
}
[Table("UserProfile", Schema = "webapi")]
public class UserProfileWebApi
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
}

如果您想更进一步,可以为这两个类创建一个接口。但是,我不认为这是一个好的做法,您应该创建一个具有不同名称的表,以避免混淆。

不应该单独管理不同的用户上下文,因为实体可以区分由表或标识符列分隔的类型。

当对同一项使用两个上下文并且不再可能缓存时,可以引入竞争条件。

既然要维护Single (same) Database。我认为,您不需要为同一个数据库使用两个不同的Contexts

如果你维持Two database,那么你可以用Two Context's。在此之前,没有必要为同一个数据库提供两个上下文。坦率地说,这是浪费时间和精力。

对于同一个数据库使用多个上下文也不是一个好的代码实践。如果是实时的,可能会产生性能问题。

在您的示例中,您可以创建两个表并使用单个Context。因为正如你写的,它有不同的属性和类型。我猜你也在使用代码第一的方法。我建议使用single Context for single DB

我可以看到两个选项:

  1. 让每个用户类型扩展一个基本用户,这样任何附加属性都可以存储在该用户类型的单独表中。这将涉及将两种类型的用户的基本用户数据存储在相同的(现有的)表中。如果两种用户类型的身份验证过程相同(用户名+密码),那么应该这样做。这样你就可以在你的控制器方法中使用现有的属性来进行身份验证。

  2. 如果用户没有关于身份验证的通用属性/行为,那么您将需要为第二类用户实现自定义解决方案。这可能涉及为用户数据使用不同的模式,或者围绕身份验证创建自己的逻辑。我猜在这种情况下,这两种类型的用户永远不会调用相同的API方法?您可以为第二种用户类型创建自定义身份验证属性。我很难相信你会走这条路。