Set LINQ DSN for DataContext



我通常将所有配置存储在注册表中。即使我已经开始使用LINQ,我也不希望在web.config中有DSN,而是让它留在注册表中,并将其附加到系统配置(可能在应用程序启动事件中)。

如何做到这一点?

谢谢你的任何想法!

edit:明确一点:我不想写入web.config文件,我只想在web.config之外的任何地方保留dsn(加密),所以我在所有开发阶段(本地、staginf、实时、备份)都有相同的web.config。

Christoph

VB.Net中的解决方案代码:

1) 添加一个新的类,带有一个方法,该方法继承自原始Datacontext:

Public Class MyDatabaseDataContext
Inherits DatabaseDataContext
Public Sub New()
    MyBase.New(Settings.DSN)
End Sub
 End Class

2) 在所有Linq数据源中使用此类,而不是在原始上下文中使用此类。

 ContextTypeName="MyProject.MyDatabaseDataContext

以下是我所做的。我有一个DataContext的基类。它被称为DataContextBase,由sqlmetal.exe生成。我有一个名为DataContext的派生类,它在我的Linq调用中使用。它看起来像这样:

public class DataContext : DataContextBase
{
    public DataContext()
        : base(ConnectionHolder.ConnectionString)
    {
    }
}

我的库中有一个名为ConnectionHolder的静态类,它存储连接字符串:

public static class ConnectionHolder
{
    static string _ConnectionString;
    public static string ConnectionString
    {
        get { return _ConnectionString; }
        set { _ConnectionString = value; }
    }
}

(注意:这与DataContext是分开的,因为在Linq之外的应用程序中有一些地方我使用连接字符串)。在应用程序启动时,我说ConnectionHolder.ConnectionString=(存储连接字符串的位置)。

为什么不在web.config中对其进行加密?如果您不想使用aspreg_iis,那么只加密Application_Start上web.config中的连接字符串是相当容易的。之后,您甚至可以使用IIS管理工具编辑加密的web.config。

Configuration config = WebConfigurationManager.OpenWebConfiguration(
                               HttpContext.Current.Request.ApplicationPath );
ConfigurationSection section = config.Sections["connectionStrings"];
if (!section.SectionInformation.IsProtected
    && !GlobalConfiguration.ApplicationVersion.EndsWith( "dev" )) // don't encrypt dev
{
    section.SectionInformation.ProtectSection( "DataProtectionConfigurationProvider" );
    config.Save();
}

如果必须将其存储在注册表中。您可以始终在DataContext上使用构造函数,该构造函数接受连接字符串并传入从注册表中读取的值。假设您将其存储在应用程序存储中,因此您只需从注册表中读取一次。

Scott Guthrie有一个很好的参考页面来加密您的网络配置,尽管大多数示例都使用aspreg_iis。我更喜欢在Application_Start上做,这样我就不会忘记在意外情况下加密它。

在使用遗留代码时,这是一个相当合理的要求。

DataContext类是一个分部类,所以我只添加了一个静态工厂方法,该方法加载配置设置并创建数据上下文结果。

相关内容

  • 没有找到相关文章

最新更新