如果连接字符串在代码端,如何更新实体模型?

How to update Entity Model If Connection String is at Code Side?

我正在使用 EF,在我的网络配置中,我在第一次添加模型后删除了连接字符串。所以现在看起来像这样:

<connectionStrings> </connectionStrings>

我修改了我的 Model.context.cs 文件,在其中我在实体的构造函数中添加了一个参数。下面是代码:

public QMatchServerEntities(string connectionString)
       : base(connectionString)
    {

    }

当我建立连接并创建实体对象时,我在参数中发送了整个连接字符串。我使用这种情况是因为客户端要求数据库密码应该在代码中加密。

Model.QMatchServerEntities qMatch = new Model.QMatchServerEntities("Connection string")

我想知道的是,在此之后,当我更新模型时,它要求我先创建新连接,因为 EF 无法在 Web 配置中找到该模型的连接字符串。有什么办法可以解决这个问题吗?

谢谢。

您可以在您的网络应用程序启动时实现数据库的迁移。 我假设您使用的是 .NET 6。

首先,在您的项目中创建一个名为 DbInitializer.cs 的新 class,如下所示:

using Microsoft.EntityFrameworkCore;

namespace YouAppNamespace.Data
{
    public static class DbInitializer
    {
        public static void Initialize(ApplicationDbContext ctx)
        {
            // used this for ensure database is created and for appy all migrations at runtime
            ctx.Database.Migrate();
        }
    }
}

之后,在您的 Program.cs 文件中添加“添加此部分”下提到的代码:

app.UseAuthentication();
app.UseAuthorization();

// Add this part
var serviceScope = app.Services.GetRequiredService<IServiceScopeFactory>().CreateScope();
var ctx = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
DbInitializer.Initialize(ctx);
ctx.Dispose();
serviceScope.Dispose();

app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();

app.Run();

不要忘记添加依赖项。 告诉我它是否有效。

您需要指示 DBContext 使用提供的连接字符串,因此您的代码应该像这样覆盖 OnConfiguring(...) 方法:

public class ApplicationDbContext : DbContext
{
   private readonly string _connectionString;
   public ApplicationDbContext(string connectionString)
   {
     _connectionString = connectionString;
   }

  protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  {
    optionsBuilder.UseSqlServer(_connectionString);
  }
}

您可以在这里找到更多信息:https://docs.microsoft.com/en-us/ef/core/dbcontext-configuration/