Asp.net core 使用EF Core IdentityContext和DbContext进行订单管理

Asp.net core 使用EF Core IdentityContext和DbContext进行订单管理,asp.net-core,asp.net-identity,ef-core-2.0,Asp.net Core,Asp.net Identity,Ef Core 2.0,我正在ASP MVC Core 2上创建一个电子商务网站。我从IdentityUser继承了我的用户,从IdentityDbContext继承了用于处理用户数据的上下文,从DbContext继承了用于处理产品和订单等的不同上下文 现在,我想将订单或购物车链接到一个特定的用户,但我不知道如何在订单表中引用该用户,因为它们在不同的上下文中。我还在这两个表中使用EF创建的默认guid作为主键 我是否应该放弃DbContext而只使用IdentityDbContext?这样做是否会导致identity中

我正在ASP MVC Core 2上创建一个电子商务网站。我从
IdentityUser
继承了我的用户,从
IdentityDbContext
继承了用于处理用户数据的上下文,从
DbContext
继承了用于处理产品和订单等的不同上下文

现在,我想将订单或购物车链接到一个特定的用户,但我不知道如何在订单表中引用该用户,因为它们在不同的上下文中。我还在这两个表中使用EF创建的默认guid作为主键

我是否应该放弃
DbContext
而只使用
IdentityDbContext
?这样做是否会导致identity中的异步方法和其他常用非异步方法出现问题

下面是我的类中的一些代码片段

使用Microsoft.AspNetCore.Identity;
使用制度;
使用System.Collections.Generic;
使用System.ComponentModel.DataAnnotations;
名称空间shophe1.Models
{
公共枚举性别{男性、女性、其他}
公共类用户:IdentityUser
{
公共字符串全名{get;set;}
公共性别{get;set;}
公共字符串ReferralID{get;set;}
公共日期时间注册日期时间{get;set;}
公共字符串ActivationDateTime{get;set;}
公共字符串用户类型{get;set;}
公共钱包{get;set;}
公共虚拟ICollection BankDetails{get;set;}
公共虚拟ICollection AddressDetails{get;set;}
//公共购物车{get;set;}
//公共ICollection命令{get;set;}
}
}
订单类别

使用System.Collections.Generic;
名称空间shophe1.Models
{
公共阶级秩序
{
公共字符串OrderId{get;set;}
公共ICollection产品{get;set;}
//公共用户{get;set;}
公共十进制OrderTotal{get;set;}
公共十进制ShippingCharges{get;set;}
}
}
问题是,如果我在订单模型中添加用户和在用户类中添加订单集合,这两个上下文会混淆,并且在迁移时,无论我在迁移中使用DbContext还是IdentityContext--context选项,所有与用户和产品相关的模型都会在同一个迁移中加入。这是因为用户和订单现在是相互关联的


请给出建议。

IdentityDbContext
继承您的上下文。理想情况下,每个数据库应该有一个上下文,特别是如果您希望将实体彼此关联起来

如果您确实需要单独的数据库,例如标识表驻留在一个数据库中,而应用程序表驻留在另一个数据库中,那么您将无法直接将实体相互关联。但是,您仍然可以创建一个伪外键,只需在其中一个实体的列中存储特定用户的id。然后,您只需使用此id对另一个上下文发出单独的查询,即可手动获取用户。例如:

var order = await appContext.Orders.FindAsync(orderId);
var user = await identityContext.Users.FindAsync(order.UserId);

创建两个单独的db上下文是否有特定的原因/目标?我在继承
IdentityDbContext
时没有遇到任何问题。只是我在研究,我知道只使用IdentityContext可能会导致问题,因为identity中的异步方法和常规代码中的非异步方法。我还想将产品和用户详细信息分开。那么您想将产品和用户详细信息分别保存在不同的数据库中吗?这有什么原因吗?关于“标识中的异步方法和通用代码中的非异步方法”的研究,你们有链接吗?我有和问题完全相同的场景。我完全可以理解您的观点,即与用户和产品实体建立一个上下文。但是如果你想公开你的产品和订单实体,而不是所有的用户,那该怎么办呢?然后你就按照我在剩下的回答中说的去做。将它们分开,并通过伪外键(即id)进行引用,而不受实际约束。你别无选择。