ApplicationDbContext 实例一次又一次地创建

问题描述 投票:0回答:1

我正在开发一个微服务项目。

  • 项目1:

    CustomerService
    (提供编辑客户的API)

  • 项目2:

    CoreService
    (为.NET Core微服务提供基本设置。它包含在
    ApplicationDbContext
    中使用的
    Project1
    。它还包含服务存储库,例如
    ICustomerRepository
    及其实现
    CustomerRepostory
    ) ).

注意:我使用的是内存数据库。

我的

Program.cs
Project1
看起来像这样:

var builder = WebApplication.CreateBuilder(args);

var serviceProvider = builder.Services.AddDbContext<ApplicationDbContext>().BuildServiceProvider();

using (var context = serviceProvider.GetRequiredService<ApplicationDbContext>())
{
    context.SeedData();
}

builder.Services.AddHttpContextAccessor();
builder.Services.AddHttpClient();

builder.Services.AddScoped();

我的

Project2
Program.cs
看起来像这样:

//add database related services
builder.Services.AddDbContext<ApplicationDbContext>(options =>
{
    options.UseInMemoryDatabase("InMemoryDB");
});

这是我在

ApplicationDbContext
中的
Project2
文件:

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options): base(options) 
    {
    }

    public DbSet<Customer> Customers { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseInMemoryDatabase("InMemoryDB");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<Customer>().HasKey(b => b.Id); // declaring Id as Primary key
    }

    public void SeedData()
    {
        // Ensure the database is created
        this.Database.EnsureCreated();

        if (!this.Customers.Any())
        {
            // Add initial data if the Bookings table is empty
            this.Customers.AddRange(
               new Customer
               {
                   Name = "Srijani",
                   Email = "[email protected]",
                   Address = "Abcstraße 4, 123Hamburg",
                   ContactNumber = "9876541232"
               }
            );

            // Save changes after seeding data
            this.SaveChanges();
        }
    }
}

现在,当我运行我的项目时,例如,如果我从

CustomerService
调用任何 API,我看不到来自
Project2
的种子数据,我的猜测是,当我调用时,它只是为
ApplicationDbContext
创建一个新实例正在调用
CustomerService
API。

如何防止它并使用

ApplicationDbContext
的同一实例?

c# asp.net entity-framework-core in-memory-database
1个回答
0
投票

听起来这是两个独立的过程。您无法在进程之间共享 InMemory 数据库实例。服务 1 中播种的数据库将存储在服务 1 的进程中。服务 2 可能会引用服务 1 以便能够创建 DbContext 的实例,但告诉它使用 InMemory 数据库(即使名称相同)也只会在服务 2 的进程中初始化一个空数据库。

如果您想要两个(或更多)Web 服务项目,其中一个负责初始化和播种与另一个共享的数据库,那么您需要使用实际的持久共享数据库,例如 SQL Server、SqlLite 或 PostgreSQL。我知道第二个服务可以访问第一个服务的内存数据库的唯一方法是让它远程调用第一个服务以进行所有数据访问。在这种情况下,DbContext 仅存在于第一个服务中,并且您通过命名管道等从服务到服务 1 进行 Web API 调用以访问数据。

© www.soinside.com 2019 - 2024. All rights reserved.