C# 在asp.net core和实体框架core中使用两个上下文的正确方法

C# 在asp.net core和实体框架core中使用两个上下文的正确方法,c#,asp.net,entity-framework,dbcontext,asp.net-identity-2,C#,Asp.net,Entity Framework,Dbcontext,Asp.net Identity 2,我正在尝试应用我一直在学习的东西,并且我已经参与了一部分上下文 我尝试应用的是Microsoft.Identity结构以及应用程序实体 解决方案的结构: BaseFull.Web BaseFull.Entities BaseFull.Infra.Data 我已经创建了一个接口来保留相同的新属性,因此不存在将两个类迁移到同一个“表”的问题 public interface IUsuario { string Fullname { get; set; } } 我已应用于我的用户实体和应用

我正在尝试应用我一直在学习的东西,并且我已经参与了一部分上下文

我尝试应用的是Microsoft.Identity结构以及应用程序实体

解决方案的结构:

BaseFull.Web
BaseFull.Entities
BaseFull.Infra.Data
我已经创建了一个接口来保留相同的新属性,因此不存在将两个类迁移到同一个“表”的问题

public interface IUsuario
{
    string Fullname { get; set; }
}
我已应用于我的用户实体和应用程序用户:

namespace BaseFull.Web.Models
{
    // Add profile data for application users by adding properties to the ApplicationUser class
    public class ApplicationUser : IdentityUser,  IUsuario
    {
        public string Fullname { get; set; }
    }
}


namespace BaseFull.Entities.Models
{
    public class Usuario : IUsuario
    {
        public string Fullname { get; set; }
        public Usuario()
        {
            Id = Guid.NewGuid().ToString();
        }
        #region Propriedades da AspnetUsers(Identity)
        public string Id { get; set; }
        public virtual string Email { get; set; }
        public virtual string UserName { get; set; }


  ...
        #endregion
    }
我已经在一个项目中分离了实体。我还试图在一个项目中分离上下文,正是在这个时候,我遇到了困难

 namespace BaseFull.Infra.Data.Context
{
    public class BaseFullContext: DbContext
    {
        public DbSet<Usuario> Usuarios { get; set; }
....

namespace BaseFull.Web.Data
{
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Entity<ApplicationUser>().ToTable("Usuarios");
我最大的问题是如何解决这个问题,这是使用这两种上下文的最正确和有效的方法


此处没有显示与ApplicationUser相同的用户配置类,因为我认为没有必要,但如果需要,我也会显示它。

将表分为两个上下文需要什么用例?这将使在两种上下文之间编写查询变得困难。它需要在应用程序内存中而不是在sql server中完成来自两个上下文的连接。我的建议是将所有表放入
ApplicationDbContext
。如果你愿意,我可以告诉你怎么做,让我知道。完全同意@davidele,你不应该让两个上下文共享同一个连接字符串。如果它们是不同的连接字符串(例如,连接到两个不同的数据库),则更有意义。但是这两者之间没有任何关系,甚至连继承都没有。在处理有界上下文时,您可能会使用类似的方法,但从OP示例中,我看不出这是如何适用的。这几乎就像他们看到了2个不同的上下文设置示例,并设置了2个,每种方式一个??对于原始问题:要使一个表同时出现在两个上下文中,那么只有一个上下文可以作为CodeFirst表结构的所有者。必须将其他所有上下文配置为不创建/迁移架构。对于有界上下文,我不使用CodeFirst,但即使这样,也只有一个上下文可以是任何给定实体的所有者;根据你们所展示的,我无法理解的一件事是,为什么你们需要2个上下文,你们想实现什么?您可以将2个上下文用于2个单独的数据库,也可以使用一个标识数据库并扩展它。将表分隔为两个上下文需要什么用例?这将使在两种上下文之间编写查询变得困难。它需要在应用程序内存中而不是在sql server中完成来自两个上下文的连接。我的建议是将所有表放入
ApplicationDbContext
。如果你愿意,我可以告诉你怎么做,让我知道。完全同意@davidele,你不应该让两个上下文共享同一个连接字符串。如果它们是不同的连接字符串(例如,连接到两个不同的数据库),则更有意义。但是这两者之间没有任何关系,甚至连继承都没有。在处理有界上下文时,您可能会使用类似的方法,但从OP示例中,我看不出这是如何适用的。这几乎就像他们看到了2个不同的上下文设置示例,并设置了2个,每种方式一个??对于原始问题:要使一个表同时出现在两个上下文中,那么只有一个上下文可以作为CodeFirst表结构的所有者。必须将其他所有上下文配置为不创建/迁移架构。对于有界上下文,我不使用CodeFirst,但即使这样,也只有一个上下文可以是任何给定实体的所有者;根据你们所展示的,我无法理解的一件事是,为什么你们需要2个上下文,你们想实现什么?您可以将2个上下文用于2个单独的数据库,也可以使用一个标识数据库并对其进行扩展
public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
        services.AddDbContext<BaseFullContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));....
services.AddDbContext<BaseFullAppContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")
                                , b => b.MigrationsAssembly("BaseFull.Web"))
There is already an object named 'Usuarios' in the database.