Как мне написать строку подключения? - PullRequest
0 голосов
/ 11 мая 2018

Я новичок в 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();
                }
            }
        }

Этот код, который я просто написал, почти идентичен учебнику с точки зрения руководства (название решения отличается). И у меня есть это исключение:

System.ArgumentException: формат строки инициализации не соответствовать спецификации, начиная с индекса 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. Итак, мой вопрос, что я пропустил? И как я могу разрешить это исключение?

Спасибо за чтение.

Другие исключения, которые я получил:

Исключение: «System.IO.FileNotFoundException» в файле mscorlib.dll

Возникло исключение: System.ArgumentException в System.Data.dll

Возникло исключение: System.ArgumentException в NHibernate.dll

Необработанное исключение типа 'System.ArgumentException' произошло в 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>

1 Ответ

0 голосов
/ 11 мая 2018

Исключение

System.ArgumentException: формат строки инициализации не соответствует спецификации, начиная с индекса 0

связано с утверждением:

... Но мой x.ConnectionString просто идентичен с инструкцией, и я не могу понять, что я пропустил ...

Потому что код объявляет параметры:

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 = значение2; ключ3 = value3; ...

...