【问题标题】:NInject and Migration using EF Core in Console app在控制台应用程序中使用 EF Core 注入和迁移
【发布时间】:2023-03-05 04:07:01
【问题描述】:

我使用 NInject 容器进行依赖注入和实体框架核心作为 ORM。设置如下:

数据库上下文类

    public TarantoContext()
        {

        }
public TarantoContext(DbContextOptions<TarantoContext> options)
        : base(options)
    {
    }

    public virtual DbSet<FileData> FileData { get; set; }
    public virtual DbSet<FileExport> FileExport { get; set; }
    public virtual DbSet<FileStatus> FileStatus { get; set; }
    public virtual DbSet<FileType> FileType { get; set; }
    public static string ConnectionString { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlServer(ConnectionString);
        }
    }

程序.cs

    TarantoContext.ConnectionString = configurationManager.DatabaseConnection;

我正在从 json 读取配置并将其传递给 DataAccess 层(传递给上下文类)。我的数据库中有几个表,并采用数据库优先的方法创建了必要的数据模型并完成了 dbcontext 类代码。我能够毫无问题地获取数据。现在我想添加迁移(我可能对现有表进行更多更改并可能创建新表)并在包管理器控制台中运行以下内容:

Add-Migration InitialCreate

由于connectionstring属性为空而导致以下错误

我可以通过硬编码 OnConfiguring 方法中的连接字符串来解决这个问题,我已经尝试过没有任何问题:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            // The connection string needs to exist in the migration project for the purpose of migrations. Comment it in production.
            optionsBuilder.UseSqlServer(
                "Data Source=temp;Initial Catalog=Demo;Persist Security Info=True;User ID=temp;Password=temp;MultipleActiveResultSets=True;");
            //optionsBuilder.UseSqlServer(ConnectionString);
        }
    }

但我认为这不是进行迁移的正确方法。此外,如果我无法在 Program.cs 或 dbcontext 类之外设置连接字符串,我不确定如何处理产品中的迁移。我感兴趣的是学习其他开发人员用来处理这种情况的任何设计模式。非常感谢任何建议。

【问题讨论】:

    标签: .net-core ef-core-2.0


    【解决方案1】:

    在 ASP.NET Core 中,您可以在 ConfigureServices 方法中设置服务时加载连接字符串。使用以下代码:

     services.AddDbContext<ApplicationDatabaseContext>(options =>
         options.UseSqlServer(
             Configuration.GetConnectionString("DefaultConnection"),
             b => b.MigrationsAssembly("....")));
    

    现在,GetConnectionString 调用将从您的配置文件中检索连接字符串,即appsettings.json。要为不同的环境处理不同的连接字符串,您可以使用 appsettings.&lt;Environment&gt;.json 文件(如 appsettings.Production.json)覆盖默认应用设置。

    更多信息在这里:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments?view=aspnetcore-2.2

    查看相关的 MSDN 文档页面了解这些内容,因为它们包含大量信息。

    【讨论】:

    • 除了它不是一个 asp.net 应用程序。据我所知,控制台应用程序中没有启动/OWIN 启动。
    • 啊,在这种情况下,您可以使用相同的模式,即从基于当前环境的配置文件中加载连接字符串,然后在OnConfiguring 中传递一次。我之前使用的Configuration 类本身并不是 ASP.NET 的一部分,因此您甚至可以使用它,尽管它需要更多代码才能使其工作。不过,这将是设置它的正确方法。
    • 我认为这正是我正在做的。请查看代码和说明。
    • 在这种情况下,您拥有正确的设计模式。剩下的唯一问题是 ConnectionString = null 错误,对吧?关于如何使用 DesignTimeDbContextFactory 类来解决这个问题,请参阅这篇文章:stackoverflow.com/questions/53745874/…
    • 您可以有另一个名为 Common 的层或包含所有其他层的共享代码的东西。您可以简单地在数据层中实现 DesignTimeDbContextFactory。如果您在项目中拆分了层,请始终确保从包含数据层 .csproj 的文件夹中执行 dotnet ef 命令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 2017-06-06
    • 2017-07-26
    相关资源
    最近更新 更多