如果连接字符串在代码端,如何更新实体模型?
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/
我正在使用 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/