当实体框架模型位于专用类库中时,如何在 C# 应用程序中定义连接字符串和数据库提供程序?



我正在创建一组桌面应用程序(C#,.NET Framework 4.7),它们都使用相同的数据库和模型。我正在使用实体框架 6 来设置数据库模型。为了防止出现重复的代码(模型),我将所有模型放在一个专用的"数据库"类中。在本课程中,我还定义了DbContext

通过 NuGet 将EntityFramework包添加到"数据库"类时,也会自动安装 SQLServer LocalDB 的 EF 数据库提供程序。

在不进行进一步配置的情况下启动应用程序将导致 SQLServer LocalDB 初始化并用于数据库连接。

我对"数据库端点"配置有 2 个担忧。

1) 我希望实际应用程序设置数据库连接字符串。因此,可能在不同计算机上运行的每个应用程序都可以有自己的数据库连接字符串来指向同一数据库服务器。

为此,我将"database"类中的当前DbConext修改为以下内容:

public class MyDbContext : DbContext
{
public MyDbContext(string connectionString)
{
this.Database.Connection.ConnectionString = connectionString;
}
}

现在,我可以通过应用程序而不是公共的"数据库"类来定义数据库连接字符串。

2) 我想在应用程序级别定义数据库引擎。这样我就可以将"数据库"类创建为"泛型类",并定义要在应用程序中使用的实际 EF 数据库提供程序。

如何修改我的公共"数据库"类和应用程序,以便让应用程序决定要使用哪个 EF 数据库提供程序?

EF 使用<connectionStrings>部分通过 app.config/web.config 支持开箱即用。

在应用程序 app.config 中,添加:

然后在 DbContext 类中:

public class MyDbContext : DbContext
{
public MyDbContext() 
: base("ApplicationDatabase")
{ }
public MyDbContext(string connectionString) 
: base(connectionString)
{ }
}

这样,每个客户端实例都可以在运行时自定义其连接字符串,方法是调整 Windows 应用程序的 MyApplication.exe.config 文件中的"应用程序数据库"连接字符串。如果未提供连接字符串/设置,则上面的代码默认为"ApplicationDatabase"连接字符串,或者可以使用给定的连接字符串或连接字符串设置构造一个连接字符串。

假设你在Asp网络核心上。

这就是您的startup.cs应该是什么样子。

public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
services.AddMvc();
services.AddDbContext<MyDbContext>(op => op.UseSqlServer(Configuration["DbConnection"]));
}

这就是 DbContext 构造函数应该的样子。

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

您的连接字符串将保存在 appSettings.json 中

"DbConnection": "Data Source=.;Initial Catalog=DbName;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"

在此之后,您可以将 DbContext 类注入到您想要使用它的任何位置。

您可以为 DBContext 公开一个接口。然后使用工厂模式通过适当的提供程序创建正确的上下文。Microsoft这里有一个很好的例子:

https://github.com/Microsoft/InventorySample/tree/master/src

最新更新