Я новичок в Nhibernate. Я установил NHibernate с помощью NuGet.
По NHibernate есть много руководств, но большинство из них действительно старые (все они представлены в Microsoft VS 2008). Кроме этого от TutorialsPoint. Поэтому я старался шаг за шагом следовать этому руководству. Это мой Program.cs:
class Program
{
static void Main(string[] args)
{
var cfg = new Configuration();
String DataSource = "(localdb)\\MSSQLLocalDB";
String InitialCatalog = "TutorialsPointDb";
String IntegratedSecurity = "True";
String ConnectTimeout = "30";
String Encrypt = "False";
String TrustServerCertificate = "False";
String ApplicationIntent = "ReadWrite";
String MultiSubnetFailover = "False";
cfg.DataBaseIntegration(x =>
{
x.ConnectionString = DataSource + InitialCatalog + IntegratedSecurity + ConnectTimeout + Encrypt +
TrustServerCertificate + ApplicationIntent + MultiSubnetFailover;
x.Driver<SqlClientDriver>();
x.Dialect<MsSql2008Dialect>();
});
cfg.AddAssembly(Assembly.GetExecutingAssembly());
var sefact = cfg.BuildSessionFactory();
using (var session = sefact.OpenSession())
{
using (var tx = session.BeginTransaction())
{
var student1 = new Student
{
ID = 1,
FirstMidName = "Allan",
LastName = "Bommer"
};
var student2 = new Student
{
ID = 2,
FirstMidName = "Jerry",
LastName = "Lewis"
};
session.Save(student1);
session.Save(student2);
tx.Commit();
}
Console.ReadLine();
}
}
}
Этот код, который я только что цитировал, почти идентичен руководству из tutorialspoint (название решения отличается). И у меня есть это исключение:
System.ArgumentException: Format of the initialization string does not conform to specification starting at index 0
из этой строки: var sefact = cfg.BuildSessionFactory();
И после исследования, насколько я понимаю, это исключение было вызвано плохим ConnectionString. Но мой x.ConnectionString полностью совпадает с инструкцией, и я не могу понять, что я пропустил.
И я осведомлен об этом, как правило, по имени данных: hibernate.cfg.xml в решении с такими настройками:
<?xml version = "1.0" encoding = "utf-8" ?>
<hibernate-configuration xmlns = "urn:nhibernate-configuration-2.2" >
<session-factory>
<property name = "connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name = "connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name = "connection.connection_string">Data Source=localdb\mssqllocaldb;Initial Catalog=TutorialsPointDb</property>
<property name = "show_sql">false</property>
<property name = "dialect">NHibernate.Dialect.MsSql2008Dialect</property>
<mapping assembly = "DataTransfer"/>
</session-factory>
</hibernate-configuration>
Но не на этом этапе: создание данных из NHibernate - часть основных операций CRUD. Итак, мой вопрос: что я пропустил? И как я могу разрешить это исключение?
Другие исключения, которые у меня есть:
Exception thrown: 'System.IO.FileNotFoundException' in mscorlib.dll
Exception thrown: 'System.ArgumentException' in System.Data.dll
Exception thrown: 'System.ArgumentException' in NHibernate.dll
An unhandled exception of type 'System.ArgumentException' occurred in NHibernate.dll
Другие коды из моего проекта на случай, если вы захотите проверить сами. Моя база данных:
CREATE TABLE [dbo].[Student]
(
[ID] INT NOT NULL PRIMARY KEY IDENTITY,
[LastName] NVARCHAR(MAX) NULL,
[FirstMidName] NVARCHAR(MAX) NULL
)
Это мой одноклассник Student.cs
namespace TutorialsPoint
{
public class Student
{
public virtual int ID { get; set; }
public virtual string LastName { get; set; }
public virtual string FirstMidName { get; set; }
}
}
И его файл Student.hbm.xml
<?xml version = "1.0" encoding = "utf-8" ?>
<hibernate-mapping xmlns = "urn:nhibernate-mapping-2.2"
assembly = "TutorialsPoint" namespace = "TutorialsPoint">
<class name = "Student">
<id name = "ID">
<generator class = "native"/>
</id>
<property name = "LastName"/>
<property name = "FirstMidName"/>
</class>
</hibernate-mapping>

Исключение
System.ArgumentException: Format of the initialization string does not conform to specification starting at index 0
относится к заявлению:
...But my x.ConnectionString is just identical with the instruction and I can not understand that what did I miss...
Потому что код объявляет параметры:
String DataSource = "(localdb)\\MSSQLLocalDB";
String InitialCatalog = "TutorialsPointDb";
String IntegratedSecurity = "True";
...
что не может быть просто объединено
x.ConnectionString = DataSource + InitialCatalog
+ IntegratedSecurity + ConnectTimeout
+ Encrypt + ...
Потому что это приведет к результату:
"(localdb)\\MSSQLLocalDBTutorialsPointDbTrue...
Но нам нужно что-то вроде этого:
x.ConnectionString = $"DataSource = {DataSource};"
+ $"InitialCatalog = {InitialCatalog};"
+ $"IntegratedSecurity = {IntegratedSecurity}"
+ ...
получить
"DataSource=(localdb)\\MSSQLLocalDB;InitialCatalog=TutorialsPointDb;..
И это приведет к ожидаемому формату строки подключения:
key1=value1;key2=value2;key3=value3;...
Большое спасибо. Ваш подробный ответ действительно помогает мне разрешить это исключение.