Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Entity framework 将连接字符串传递给DAL的最佳方法?_Entity Framework - Fatal编程技术网

Entity framework 将连接字符串传递给DAL的最佳方法?

Entity framework 将连接字符串传递给DAL的最佳方法?,entity-framework,Entity Framework,我有一个分层环境中的winforms项目。有一个服务层,一个处理器层,最后是一个数据访问层。实际上,客户端并不重要——它可以是winforms、web等。数据访问层使用EF。客户端应用程序允许用户在登录屏幕期间选择数据库,因此不能将my DBContext硬编码到一个数据库。让DBContext使用客户机选择的连接而不必在每次调用服务层时传入连接字符串(将传递给DAL)的最佳方法是什么 任何建议都将不胜感激,谢谢 您可以在ConnectionString部分的app.config或web.con

我有一个分层环境中的winforms项目。有一个服务层,一个处理器层,最后是一个数据访问层。实际上,客户端并不重要——它可以是winforms、web等。数据访问层使用EF。客户端应用程序允许用户在登录屏幕期间选择数据库,因此不能将my DBContext硬编码到一个数据库。让DBContext使用客户机选择的连接而不必在每次调用服务层时传入连接字符串(将传递给DAL)的最佳方法是什么


任何建议都将不胜感激,谢谢

您可以在ConnectionString部分的app.config或web.config文件中存储连接字符串。然后将连接字符串的名称传递给您的基本DbContext

app.confg
这是我想到的。Jake的解决方案要求我在web.config文件中拥有所有连接字符串(不是选项),并且我通过每个层中的每个方法调用传递正在使用的连接字符串的名称。或者,有一个连接字符串,我只是在运行时更新(这不起作用)。所以,这就是我想出的方法,它可以工作,不需要我通过每一层在每次调用时传递连接字符串名称或实际的连接字符串

1) 向每个dal类添加了一个连接字符串变量:

Private ReadOnly _connectionString As String
2) 为每个DAL类添加了2个构造函数

    Public Sub New()

        _connectionString = My.Settings.PrimaryConnectionString

    End Sub

    Public Sub New(ByVal connectionString As String)

        _connectionString = connectionString

    End Sub
这允许我默认使用DAL设置中指定的数据库,并允许我在整个应用程序中以统一的方式访问DBContext

然后,我在处理器和服务层中遵循相同的模式。我声明了一个连接字符串变量和两个构造函数,一个带有connectionString参数,另一个没有

服务领域:

Private ReadOnly _documentProcessor As DocumentProcessor
服务构造函数:

Public Sub New()

    _documentProcessor = New DocumentProcessor()

End Sub

Public Sub New(ByVal connectionString As String)

    _documentProcessor = New DocumentProcessor(connectionString)

End Sub

这样,当我实例化我的服务时,只要我想使用该服务的特定实例,我就会传入连接字符串一次。处理器和dal中的构造函数在那里处理连接字符串的设置,因此我只需要为每个服务的每个实例传入一次。我可以接受。

这可以通过在表示层上构造一个
DbConnection
对象并将连接字符串传递给它来实现。然后将其传递给服务层,服务层随后将其传递给DAL,DAL用它构造一个
DbContext
对象。但通常不建议这样做,因为您的表示层应该不知道数据访问实现/库。服务层类似于单独的web服务,还是所有层都在同一应用程序域中运行?谢谢@CircularReference,我正在寻找一种不必将连接字符串或DBConnection传递给每个服务调用的方法,这将是一个巨大的痛苦。@GertArnold,目前服务层只是表示层引用的另一个类库项目。那么,这很简单。上下文从执行程序集的配置文件中读取其连接字符串。看到给定的答案了。对,但这不意味着我必须在每个方法中从UI向下通过其他两层传递连接字符串到dal方法吗?可能我误解了…客户端项目的app.config中引用的连接字符串名称。
Private ReadOnly _documentProcessor As DocumentProcessor
Public Sub New()

    _documentProcessor = New DocumentProcessor()

End Sub

Public Sub New(ByVal connectionString As String)

    _documentProcessor = New DocumentProcessor(connectionString)

End Sub