【问题标题】:Relative Path Connection String with NHibernateNHibernate 的相对路径连接字符串
【发布时间】:2012-10-16 23:00:30
【问题描述】:

我正在使用以下代码通过 NHibernate 创建Session Factory。我想用相对路径来指定这个路径,这样当我和我的队友合并我们的分支时,我们就不必继续修复连接字符串。我怎样才能做到这一点?

private static void InitializeSessionFactory(bool deleteSchemaOnClosing = false, bool regenerateSchemaOnOpening = false)
{
_sessionFactory = Fluently.Configure()
    .Database(MsSqlConfiguration.MsSql2008
                  .ConnectionString(
                      @"Data Source=.\SQLEXPRESS;AttachDbFilename=""C:\MyProject\MyProjectCore\Fluent NHibernate\CoreDatabase.mdf"";Integrated Security=True;User Instance=True")
                  .ShowSql()
    )
    .Mappings(m =>
              m.FluentMappings
                  .AddFromAssemblyOf<User>())
    .ExposeConfiguration(cfg => new SchemaExport(cfg)
                                    .Create(deleteSchemaOnClosing,regenerateSchemaOnOpening))
    .BuildSessionFactory();
}

我的app.config 文件如下所示:

<?xml version="1.0"?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="CoreDatabase.Properties.Settings.CoreDatabaseConnectionString"
            connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\CoreDatabase.mdf;Integrated Security=True;User Instance=True"
            providerName="System.Data.SqlClient" />
        <add name="Fluent_NHibernate.Properties.Settings.CoreDatabaseConnectionString"
            connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\CoreDatabase.mdf;Integrated Security=True;User Instance=True"
            providerName="System.Data.SqlClient" />
    </connectionStrings>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/></startup></configuration>

谢谢!

【问题讨论】:

  • 您可以添加 .config 文件的路径并使用“{0}”、ConfigFile Key .. 获取它吗?您也可以在 .config 文件中使用 {0} 参数来动态读取值,这样更改只会发生在 1 个位置,而不必在每次需要更改值时都重新编译代码
  • 嗨 DJ KRAZE,你能帮我把它哑一点吗?我是这方面的新手。

标签: c# nhibernate connection-string relative-path


【解决方案1】:

看看 SqlConnectionStringBuilder,你可以这样做:

var rawStr = Settings.CoreDatabaseConnectionString.ConnectionString;
// retrieve the original connection string from config file

var conBuilder = new SqlConnectionStringBuilder(rawStr);
conBuilder.AttachDBFilename = Path.GetFullPath(
    Path.Combine(Environment.CurrentDirectory, "CoreDatabase.mdf"));
// if you're doing this in a web environment, swap Environment.CurrentDirectory 
// for HttpRuntime.AppDomainAppPath

_sessionFactory = Fluently.Configure()
    .Database(MsSqlConfiguration.MsSql2008
                  .ConnectionString(conBuilder.ToString())
                  .ShowSql()
    )
// rest of your configuration...

【讨论】:

  • 嗨,马丁!感谢您的回复。我试图弄清楚如何使用var rawStr = Settings.CoreDatabaseConnectionString.ConnectionString;,但它不起作用。我也试过var rawStr = ConfigurationManager.ConnectionStrings["Fluent_NHibernate.Properties.Settings.CoreDatabaseConnectionString"].ConnectionString;,它也不起作用。有什么建议吗?
  • 从您的 app.config 文件看来,您应该有一个名为 settings 的类,它包含对连接字符串的访问。如果没有, ConfigurationManager.ConnectionStrings["Fluent_NHibernate.Properties.Settings.Co‌​reDatabaseConnectionString"].ConnectionString 应该可以工作 - 如果你这样做,你会得到什么错误?
  • 尝试使用“Fluent_Nhibernate.Properies...”提取连接字符串会给我一个空引用错误。这是因为ConfigurationManager包含两个字符串,一个是{data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true},另一个是null
  • 请参阅codeproject.com/Tips/416198/… 了解如何从您的 app.config 文件中获取连接字符串
  • 啊,我发现了问题。 app.config 文件位于具有数据库的项目中。这一切都很好,但我还需要在我正在工作的项目的 app.config 文件中拥有相同的信息。我很傻。感谢大家的帮助!
【解决方案2】:

作为一个例子,你可以遵循这样的.. 这将是一种将值保存到 .Config 文件的方法,但只是为了给您提供一个示例,说明如何在 .Config 文件中使用参数,看看这个。

如果您确实需要示例,我还将以更简单的方式附加到我的答案中

//Add config like this:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>

  </connectionStrings>
</configuration>


 Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            config.ConnectionStrings.ConnectionStrings.Add(new ConnectionStringSettings(
                                                          "MyConnectionString",
                                                          String.Format("DataSource={0};InitialCatalog={1};IntegratedSecurity={2}",
                                                                         "testing", "testing2", "Testing6")));
            config.Save(ConfigurationSaveMode.Modified, true);
            ConfigurationManager.RefreshSection("connectionStrings");
            MessageBox.Show(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString)

看看如何从配置文件中读取并尝试链接上的示例代码并逐步执行代码,这将是一次很棒的学习体验... How to read Application Settings from .Config file

【讨论】:

  • 嗨 DJ KRAZE,你能帮我举个例子吗?
  • 我给了你一个例子,你有什么问题......请粘贴或显示你正在实现 Params 示例的代码,谢谢
猜你喜欢
  • 2011-06-27
  • 2014-10-29
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
相关资源
最近更新 更多