具有多个数据库上下文的.NET Core应用程序不会在所有DbContext中生成表

MJZSoft

我已经用制作了一个OData服务器.NET core 3.1

在此应用程序中,我有2个数据库上下文。其中一项用于应用程序本身(AppDbContext),另一项用于帐户管理和身份验证(AccountDbContext)。

我有一个ServiceExtensions这样的:

public static class ServiceExtensions
{
            
    public static void ConfigureMySqlContext(this IServiceCollection services, IConfiguration configuration)
    {
        services.AddDbContext<AppDbContext>(options =>
        {
            options.UseMySql(configuration.GetConnectionString("MysqlConnection"),
                mysqlOptions => {
                    mysqlOptions.ServerVersion(new ServerVersion(new Version(5, 4, 3), ServerType.MySql));
                });
        });

        services.AddDbContext<AccountDbContext>(options =>
        {
            options.UseMySql(configuration.GetConnectionString("MysqlConnection"),
                mysqlOptions => {
                    mysqlOptions.ServerVersion(new ServerVersion(new Version(5, 4, 3), ServerType.MySql));
                });
        });

    }
        
}

在中,startup.cs我将调用以下ConfigureMySqlContext函数:


public class Startup
{
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. 
        // I use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {

            services.ConfigureMySqlContext(Configuration);
        }
}

public static class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args)
            .Build()
            .CreateDbIfNotExists()
            .Run();
    }

    private static IHost CreateDbIfNotExists(this IHost host)
    {
        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            var accountDbContext = services.GetRequiredService<AccountDbContext>();
            accountDbContext.Database.EnsureCreated();

            var appDbContext = services.GetRequiredService<AppDbContext>();
            appDbContext.Database.EnsureCreated();
                
        }

        return host;
    }
}

该代码的目的是在数据库内部的两个上下文中生成所需的表。问题是,当我将该应用程序发布到服务器时,以及当该应用程序首次运行时,它只会生成并初始化中的表AppDbContext为什么?因为它放在前面AccountDbContext

如果我ConfigureMySqlContext按照以下方式更改功能并再次发布该应用程序:

public static class ServiceExtensions
{
            
    public static void ConfigureMySqlContext(this IServiceCollection services, IConfiguration configuration)
    {

        services.AddDbContext<AccountDbContext>(options =>
        {
            options.UseMySql(configuration.GetConnectionString("MysqlConnection"),
                mysqlOptions => {
                    mysqlOptions.ServerVersion(new ServerVersion(new Version(5, 4, 3), ServerType.MySql));
                });
        });

        services.AddDbContext<AppDbContext>(options =>
        {
            options.UseMySql(configuration.GetConnectionString("MysqlConnection"),
                mysqlOptions => {
                    mysqlOptions.ServerVersion(new ServerVersion(new Version(5, 4, 3), ServerType.MySql));
                });
        });       
    }        
}

然后将是AccountDbContext第一次运行后将在数据库中启动的表中的表

斯拉瓦·克尼亚泽夫(Slava Knyazev)

问题在于,它的核心EnsureCreated是非常简单的语义,可以将其建模为:

if (!database.exists()) {
   database.create();
}

在这里exists()检查数据库的存在,而不检查数据库中的表是否存在。

最终结果是,如果数据库不是完全为空,EnsureCreated()则将无效。

有两种方法可以解决此问题:

  1. 将数据库拆分为两个。这是EntityFramework最喜欢的解决方案。

但是,如果不是这样,请查看:

  1. 查看IRelationalDatabaseCreator.CreateTables()方法:

https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.entityframeworkcore.storage.irelationaldatabasecreator?view=efcore-5.0

这是一个可能的解决方案:

using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.EntityFrameworkCore.Infrastructure;
public static class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args)
            .Build()
            .CreateDbIfNotExists()
            .Run();
    }

    private static IHost CreateDbIfNotExists(this IHost host)
    {
        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;
            try
            {
                var accountDbContext = services.GetRequiredService<AccountDbContext>();
                accountDbContext.Database.EnsureCreated();
                var accountDbCreator = accountDbContext.GetService<IRelationalDatabaseCreator>();
                accountDbCreator.CreateTables();
            }
            catch (Exception e) { }

            try
            {
                var appDbContext = services.GetRequiredService<AppDbContext>();
                appDbContext.Database.EnsureCreated();
                var appDbCreator = appDbContext.GetService<IRelationalDatabaseCreator>();
                appDbCreator.CreateTables();
            }
            catch (Exception e) { }
        }

        return host;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当使用.Net Core的Postgres sql在一个数据库中有多个架构可用时,如何仅为一个架构生成实体上下文?

来自分类Dev

删除多个项目具有数据库的上下文操作模式

来自分类Dev

在ASP.Net MVC中合并多个数据库上下文

来自分类Dev

在Xunit集成测试中检索ASP.NET Core 3.1数据库上下文

来自分类Dev

将数据库上下文注入自定义属性.NET Core

来自分类Dev

如何在 .net core 中访问数据库上下文表单视图

来自分类Dev

为每个用户类型(.net)建立具有多个数据库实例的网站

来自分类Dev

具有通用数据库上下文的存储库模式

来自分类Dev

如何在asp.net core 2中的静态方法/类中访问数据库上下文

来自分类Dev

Net Core 3.0 Linux Azure Web App IHttpContextAccessor具有空上下文

来自分类Dev

多个数据库与具有逻辑分区数据的单个数据库

来自分类Dev

拥有多个数据上下文是一种好习惯吗?

来自分类Dev

具有多个数据库的CoreData

来自分类Dev

具有多个数据库的SSRS报告

来自分类Dev

EF具有不同版本的多个数据库

来自分类Dev

docker-compose具有多个数据库

来自分类Dev

首先将现有视图添加到代码中数据库上下文?

来自分类Dev

有使用数据库上下文类的正确方法吗?

来自分类Dev

在我的域模型中有数据库上下文是否可以

来自分类Dev

每次不使用都会创建不同的数据库上下文是否有问题

来自分类Dev

在我的域模型中有数据库上下文可以吗

来自分类Dev

window.location或window.location.href不会在所有浏览器MVC应用程序中更改值

来自分类Dev

实体框架具有多个线程的单个上下文

来自分类Dev

具有多个上下文的Spark作业失败

来自分类Dev

Django在单个视图中具有多个上下文

来自分类Dev

具有多个上下文的Spark作业失败

来自分类Dev

PHP-具有多个数据库的应用程序

来自分类Dev

具有自动配置的Spring Data JPA应用程序的多个数据库

来自分类Dev

具有多个数据库的项目中的数据库文件路径错误

Related 相关文章

  1. 1

    当使用.Net Core的Postgres sql在一个数据库中有多个架构可用时,如何仅为一个架构生成实体上下文?

  2. 2

    删除多个项目具有数据库的上下文操作模式

  3. 3

    在ASP.Net MVC中合并多个数据库上下文

  4. 4

    在Xunit集成测试中检索ASP.NET Core 3.1数据库上下文

  5. 5

    将数据库上下文注入自定义属性.NET Core

  6. 6

    如何在 .net core 中访问数据库上下文表单视图

  7. 7

    为每个用户类型(.net)建立具有多个数据库实例的网站

  8. 8

    具有通用数据库上下文的存储库模式

  9. 9

    如何在asp.net core 2中的静态方法/类中访问数据库上下文

  10. 10

    Net Core 3.0 Linux Azure Web App IHttpContextAccessor具有空上下文

  11. 11

    多个数据库与具有逻辑分区数据的单个数据库

  12. 12

    拥有多个数据上下文是一种好习惯吗?

  13. 13

    具有多个数据库的CoreData

  14. 14

    具有多个数据库的SSRS报告

  15. 15

    EF具有不同版本的多个数据库

  16. 16

    docker-compose具有多个数据库

  17. 17

    首先将现有视图添加到代码中数据库上下文?

  18. 18

    有使用数据库上下文类的正确方法吗?

  19. 19

    在我的域模型中有数据库上下文是否可以

  20. 20

    每次不使用都会创建不同的数据库上下文是否有问题

  21. 21

    在我的域模型中有数据库上下文可以吗

  22. 22

    window.location或window.location.href不会在所有浏览器MVC应用程序中更改值

  23. 23

    实体框架具有多个线程的单个上下文

  24. 24

    具有多个上下文的Spark作业失败

  25. 25

    Django在单个视图中具有多个上下文

  26. 26

    具有多个上下文的Spark作业失败

  27. 27

    PHP-具有多个数据库的应用程序

  28. 28

    具有自动配置的Spring Data JPA应用程序的多个数据库

  29. 29

    具有多个数据库的项目中的数据库文件路径错误

热门标签

归档