Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF4/5自动生成本地数据库:what';SQL Server的等价物是什么?_C#_Entity Framework 5_Sql Server 2008 Express - Fatal编程技术网

C# EF4/5自动生成本地数据库:what';SQL Server的等价物是什么?

C# EF4/5自动生成本地数据库:what';SQL Server的等价物是什么?,c#,entity-framework-5,sql-server-2008-express,C#,Entity Framework 5,Sql Server 2008 Express,我一直在开发一个使用EntityFramework5作为ORM的web应用程序。EF5将为我想要的每个新数据库自动生成一个文件(其默认行为没有连接字符串,但在web.config中指定了System.Data.Entity.Infrastructure.LocalDbConnectionFactory)。我已经为每个客户生成了一个新的数据库。在我的有生之年,我预计总共不会超过5000名客户。如何将此功能转换到大型Sql Server上?我需要自己编写代码在上面创建数据库吗?这将走向何方?在我的工

我一直在开发一个使用EntityFramework5作为ORM的web应用程序。EF5将为我想要的每个新数据库自动生成一个文件(其默认行为没有连接字符串,但在web.config中指定了System.Data.Entity.Infrastructure.LocalDbConnectionFactory)。我已经为每个客户生成了一个新的数据库。在我的有生之年,我预计总共不会超过5000名客户。如何将此功能转换到大型Sql Server上?我需要自己编写代码在上面创建数据库吗?这将走向何方?

在我的工作场所,我们为应用程序的每个后续版本生成并存储一个创建脚本,以便随时可以在任何版本启动数据库。这是我建议的创建新数据库的方法(在服务器上创建数据库的代码,然后运行创建脚本)。这段代码将在您注册新客户机的任何地方运行(可能会延迟他们的注册通知,直到他们的数据库准备就绪?)

我认为从一个SQL Server实例中运行5000个数据库是一个不合理的大数,您应该考虑如何将数据库拆分到单独的服务器上,以及如何管理指向正确主机的操作。 给定SQL Server上现有数据库的连接字符串和正确的初始化设置(

CreateIfNotExist
),您的
DbContext
将发挥其魔力,为您创建数据库结构。这当然会使您的数据库中缺少任何非表元素(存储过程、函数),因此您必须设法在事后添加这些元素(除非这是EF的一个功能,我不知道)

您还可以重新处理数据库结构,以便所有客户机都存在于一个数据库中,其中的表都有一个ClientID字段。因为我不知道你的应用程序的细节,所以很难说这是不是一个好的解决方案

关于EF和连接字符串:

要在实体框架中指定连接字符串,有两个选项

备选案文1。将实际连接字符串(作为字符串)传递到DbContext的构造函数中。您也可以通过这种方式执行方法2,但不需要在app.config(或web.config)中传入实际的连接字符串,而是传入连接字符串的名称

选项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”
)作为参数传递给它的超类(在构造函数中):

这将导致可以自动创建每个客户的数据库。 如果您首先使用代码(我认为,这是因为您谈到了自动生成数据库),您(你们两个;))还应该研究EF迁移,它在版本更新时生成更改脚本,并在SQL中为您处理它们


希望这有帮助

我不太了解EF对连接字符串的操作,不知道它在创建数据库后是否会将默认数据库附加到连接字符串。@Brannon我已经在我的回答中添加了一些相关信息。从您的回答中仍然不清楚如何将web.config中的一个连接字符串用于多个连接字符串数据库(在单个服务器端点上)。在app.config中创建“通用”连接字符串。这是通过将连接字符串的一部分更改为
Initial Catalog={0}
来实现的。然后使用string.Format()设置数据库名称,并使用上面的选项1将生成的连接字符串传递到上下文中。您不能使用连接字符串的名称并让EF自动加载,因为在插入数据库名称之前,该名称无效。在这种情况下,我在何处输入数据库名称?数据库名称将进入连接字符串。请参阅此处:
<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>
class MyDBContext : DBContext {
    public MyDBContext(String customerConnectionString) : base("name="+customerConnectionString) {}
}