nHibernate 和 SQL Server 2012 LocalDB

6

是否可以在NHibernate中使用LocalDB数据库?如果可以,需要安装/配置什么?

目前,当创建SessionFactory时,尝试使用类似于Data Source=(LocalDb)\v11.0;Initial Catalog=tst1;Integrated Security=SSPI的连接字符串时,会遇到以下错误:

System.Data.SqlClient.SqlException:在建立与 SQL Server 的连接时出现网络相关或特定于实例的错误。找不到服务器,也无法访问。请确认实例名称是否正确,并且 SQL Server 已配置为允许远程连接。(提供程序:Named Pipes Provider,错误:40 - 无法打开到 SQL Server 的连接) ----> System.ComponentModel.Win32Exception:找不到网络路径。

但是,我可以通过SQL Server Object Explorer连接到(LocalDb)\v11.0,并且Entity Framework可以使用该连接字符串。那么,我在NH上做错了什么,或者目前不可能使用LocalDB和NH?


1
你可能需要使用陈旧的nH语法,例如np:\\.\pipe\LOCALDB#ABB78D50\tsql\query - 有关背景,请参见http://www.mssqltips.com/sqlservertip/2694/getting-started-with-sql-server-2012-express-localdb/。 - Aaron Bertrand
谢谢,那似乎可以工作,但我不太满意通过命令行创建实例。 - Shaddix
然后向nHibernate团队施压,要求他们更新对SqlLocalDb的支持。另外,你不应该每次启动程序时都创建一个实例。难道你不能停止和启动实例吗?一旦你知道管道名称,之后就不必再手动操作了... - Aaron Bertrand
其实我想在我的测试中尝试一下,如果性能可以的话,甚至可能会使用每个测试实例。 :) - Shaddix
5个回答

2

你可能需要使用陈旧的语法 nH,例如:

np:\\.\pipe\LOCALDB#ABB78D50\tsql\query
< p >(关于为什么有时需要使用这种语法来连接字符串的背景,请参见 mssqltips.com 上的此提示,适用于 SQL Server 2012,以及此提示,适用于更现代的版本。)< / p > < p >我知道这不是一个理想的答案,但在 nHibernate 正式支持 SqlLocalDb 之前,这可能是您唯一的选择……希望我错了,有人已经找到了更优雅的连接方式。< / p >

1

您不需要使用np:\,因为这种类型的连接字符串对所有人来说都是一个大麻烦。本地命名管道的地址经常变化,因此您必须在连接字符串中反映出来。

要使用NHibernate与localDB,请获取最新版本的NHibernate并使用以下连接字符串:

Server=(localdb)\v11.0;Initial Catalog=<dbname>;User ID=<user>;password=<pwd>;Integrated Security=false;AttachDBFilename=<dbfile_path><dbfilename>.mdf

"这个技巧是 AttachDBFilename。"

1

是的,可以连接。转到“视图” -> “服务器资源管理器” -> 展开“数据连接”,然后右键单击您的 并转到“属性”。您将看到标识、连接和其他区域。在连接区域中,您将找到需要配置NHibernate的.xml文件的连接字符串。将该字符串复制到连接.string属性下,如下所示:

<property name="connection.connection_string">Data Source=(LocalDb)\v11.0;AttachDbFilename={path}\aspnet-{projectName}-20141201132517.mdf;Initial Catalog=aspnet-{projectName}-20141201132517;Integrated Security=True</property>

我已经按照this中的文章将NHibernate添加到我的MVC项目中。

希望这可以帮助您。


0

请确保您安装了此更新: http://support.microsoft.com/kb/2544514

然后,请确保已创建数据库:

  • 使用数据库资源管理器或 SQL 管理工具连接到 (localdb)\v11.0
  • 运行 CREATE DATABASE [dbname]
  • 如有必要,请创建表

将连接字符串更改为:

Data Source=(LocalDb)\v11.0;Initial Catalog=dbname;Integrated Security=true

然后运行 Web 应用程序,它应该可以正常工作。


0

我在连接字符串中也使用了 AttachDBFilename=|DataDirectory|\Database_name.mdf

<configSections>
  <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
</configSections>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory name="">
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="connection.connection_string_name">LocalDb</property>
    <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
  </session-factory>
</hibernate-configuration>
<connectionStrings>
  <add name="LocalDb" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=MyDatabase;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\MyDatabase.mdf" providerName="System.Data.SqlClient" />
</connectionStrings>

而且MyDatabase.mdf位于应用程序的App_Data目录中


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接