我一直在开发一个使用 Entity Framework 5 作为 ORM 的 Web 应用程序。EF5 将为我想要的每个新数据库自动生成一个文件(其默认行为没有连接字符串,但在 web.config 中指定了 System.Data.Entity.Infrastructure.LocalDbConnectionFactory)。我一直在为每个客户生成一个新数据库。我预计在我的一生中客户总数不会超过 5000 人。如何将此功能转换到大型 Sql Server 上?我需要编写自己的代码来在那里创建数据库吗?那会去哪里?
2 回答
在我的工作场所,我们为应用程序的每个后续版本生成并存储一个创建脚本,以便我们可以随时启动任何版本的数据库。这将是我建议的创建新数据库的方法(在服务器上创建数据库然后运行创建脚本的代码)。该代码将在您注册新客户的任何地方运行(可能会延迟他们的注册通知,直到他们的数据库准备好?)。
我认为在一个 SQL Server 实例中运行 5000 个数据库是一个不合理的大数字,您应该考虑如何将数据库拆分到单独的服务器上以及如何管理指向正确的主机。
给定一个到 SQL Server 上现有数据库的连接字符串和正确的初始化设置 ( CreateIfNotExist
),您DbContext
将发挥它的魔力并为您创建数据库结构。这当然会让您在数据库中缺少任何非表元素(存储过程、函数),因此您必须在事后管理添加这些元素(除非这是我不知道的 EF 功能)。
您还可以重新设计数据库结构,以便所有客户端都存在于一个数据库中,其中的表具有 ClientID 字段。由于我不知道您的应用程序的详细信息,因此很难说这是否是一个好的解决方案。
关于 EF 和连接字符串:
要在实体框架中指定连接字符串,您有两个选项。
选项 1. 将实际连接字符串(作为字符串)传递到 DbContext 的构造函数中。您也可以通过这种方式执行方法二,但不是传入实际的连接字符串,而是在 app.config(或 web.config)中传入连接字符串的名称。
public class YourContext
{
public YourContext(string connectionString) : base(connectionString) { }
}
选项 2:在使用 DbContext 的应用程序的 app.config 中指定连接字符串,并在 app.config 中传递连接字符串的名称。这是我的首选方法,我通常将名称硬编码到 DbContext 类中。
public class YourContext
{
public YourContext() : base("YourContext") {}
}
在你的 App.Config
<connectionStrings>
<add name="YourContext" connectionString="Data Source=YourDataSource(SQLServerInstance);Initial Catalog=YourDatabaseName;User Id=selfexplanatory;Password=selfexplanatory" providerName="System.Data.SqlClient" />
<add name="GenericYourContext" connectionString="Data Source=YourDataSource(SQLServerInstance);Initial Catalog={0};User Id=selfexplanatory;Password=selfexplanatory" providerName="System.Data.SqlClient" />
</connectionStrings>
“大”SQL Server,可以通过连接字符串来控制,没有任何问题。您的 DBContext 只需将 connectionString ( "name=yourconnectionStringNameHere"
) 的名称作为参数传递给它的超类(在构造函数中):
class MyDBContext : DBContext {
public MyDBContext(String customerConnectionString) : base("name="+customerConnectionString) {}
}
这将导致每个客户都有一个可以自动创建的数据库。如果您使用的是代码优先(我认为,因为您说的是自动生成数据库),那么您(你们俩;))还应该查看 EF-Migrations,它会在版本更新时生成更改脚本并在 SQL 中处理它们你。
希望这可以帮助