Asp.net core 同一数据库的两个dbcontext

Asp.net core 同一数据库的两个dbcontext,asp.net-core,entity-framework-core,Asp.net Core,Entity Framework Core,我有以下两个项目的解决方案: Razor类库 ASP.NET核心web应用程序 在类库中,我有一个dbcontext,如下所示: public partial class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string> { public ApplicationDbContext(DbContextOptions<ApplicationDbContex

我有以下两个项目的解决方案:

  • Razor类库
  • ASP.NET核心web应用程序
在类库中,我有一个dbcontext,如下所示:

public partial class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }

    public DbSet<Customer> Customers { get; set; }
}
public分部类ApplicationDbContext:IdentityDbContext
{
公共应用程序DBContext(DbContextOptions选项)
:基本(选项)
{
}
公共数据库集客户{get;set;}
}
在web应用程序中,我使用Startup.cs文件中的以下行将dbcontext注册为服务

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("ApplicationDbContextConnection")));
services.AddDbContext(选项=>
options.UseSqlServer(
GetConnectionString(“ApplicationDbContextConnection”);
此时,我可以在两个项目中使用dbcontext。现在,在不更改类库的情况下,我希望为同一数据库定义新表,因此我在web应用程序项目中创建了一个新的dbcontext,它继承了我在类库中拥有的dbcontext

public class ExtendedApplicationDbContext : ApplicationDbContext
{
    public ExtendedApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    {
    }
    public DbSet<Product> Products { get; set; }
}
public类扩展的ApplicationDbContext:ApplicationDbContext
{
公共扩展的ApplicationDBContext(DbContextOptions选项):基本(选项)
{
}
公共数据库集产品{get;set;}
}
我更新Startup.cs文件,以便注册新的dbcontext,以便能够在web应用程序中使用Products表

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("ApplicationDbContextConnection")));
        services.AddDbContext<ExtendedApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("ApplicationDbContextConnection")));
services.AddDbContext(选项=>
options.UseSqlServer(
GetConnectionString(“ApplicationDbContextConnection”);
services.AddDbContext(选项=>
options.UseSqlServer(
GetConnectionString(“ApplicationDbContextConnection”);
现在我可以在这两个项目中使用ApplicationDbContext,但是当我尝试在web应用程序中使用ExtendedApplicationDbContext时,发生了一些奇怪的事情

我可以读取数据,但我所做的所有更改都不会更新数据库

我试图解释一下,但我找不到解决问题的办法。
有人能帮我理解我的代码出了什么问题吗?

EF contexts保留对象缓存和内部更改跟踪。有两个单独的上下文引用同一个数据库将不可避免地导致同步问题,这将导致一个上下文破坏另一个上下文正在做的事情,反之亦然。简言之,每个数据库应该只有一个活动上下文

我之所以指定active,是因为可以使用“有界”上下文,其中有多个上下文实际上连接到同一个数据库,但这样的上下文应该只处理数据库中对象的一个子集,没有重叠。例如,您可能有一个与客户一起工作的上下文和一个与产品一起工作的上下文,但这两个上下文之间不应存在交叉,即“产品”上下文不应以任何方式(即使仅通过关系)引用客户,反之亦然


长话短说,这不是正确的道路。首先,RCL和web应用程序都不应该有上下文。它应该位于不同的类库中,然后可以在其他两个项目之间共享。此外,web应用程序层不应该对数据层进行任何模式更改,因为该数据层正被其他事物使用。那是一个射中你自己脚的好方法。将数据层的内容保留在数据层中。

您是否在正确的上下文中调用
SaveChanges
/
等待savechangesync
?你能展示一下你在哪里做修改的代码吗?我同时使用了SaveChanges()和savechangessync()与我对dbcontext的工作方式相同。是否有一种方法仅注册扩展dbcontext,并以某种方式使用接口或泛型变量使其可用于类库?我使用接口实现了它,它可以工作。谢谢你,因为你帮我找到了解决问题的方法。