Учебники

NHibernate — Отображение типов данных

В этой главе мы рассмотрим типы данных отображения. Сопоставление сущностей является простым, классы сущностей всегда сопоставляются с таблицами базы данных с использованием элементов сопоставления <class>, <subclass> и <join-subclass> . Типам значений нужно нечто большее, именно здесь требуются типы отображения.

NHibernate может отображать самые разные типы данных. Вот список наиболее распространенных типов данных, которые поддерживаются.

Тип отображения Тип .NET System.Data.DbType
Int16 System.Int16 DbType.Int16
Int32 System.Int32 DbType.Int32
Int64 System.Int64 DbType.Int64
не замужем System.Single DbType.Single
двойной System.Double DbType.Double
Десятичный System.Decimal DbType.Decimal
строка System.String DbType.String
AnsiString System.String DbType.AnsiString
Байт System.Byte DbType.Byte
голец System.Char DbType.StringFixedLength — один символ
AnsiChar System.Char DbType.AnsiStringFixedLength — один символ
логический System.Boolean DbType.Boolean
Guid System.Guid DbType.Guid
PersistentEnum System.Enum (перечисление) DbType для базового значения
TrueFalse System.Boolean DbType.AnsiStringFixedLength — либо «T», либо «F»
Да нет System.Boolean DbType.AnsiStringFixedLength — либо «Y», либо «N»
DateTime DateTime DbType.DateTime — игнорирует миллисекунды
Клещи System.DateTime DbType.Int64
Промежуток времени System.TimeSpan DbType.Int64
Отметка System.DateTime DbType.DateTime — настолько, насколько это поддерживает база данных
двоичный System.Byte [] DbType.Binary
блоб System.Byte [] DbType.Binary
StringClob System.String DbType.String
Сериализуемый Любой объект System.Object, помеченный атрибутом SerializableAttribute. DbType.Binary
CultureInfo System.Globalization.CultureInfo DbType.String — пять символов для культуры
Тип Тип системы DbType.String, содержащий квалифицированное имя сборки

Приведенная выше таблица подробно объясняет нижеуказанные указатели.

  • Все, начиная от простых числовых типов и заканчивая строками, которые можно отображать различными способами, используя varchars, chars и т. Д., А также строковые объекты и все разнообразие типов, поддерживаемых базами данных.

  • Он также может отображать логические поля, как поля, использующие нули, так и поля, символьные поля, которые содержат истину, ложь или T и F.

  • Существует множество способов определения того, как это отображается на бэкэнд, логические значения в базе данных.

  • Мы можем обрабатывать отображение DateTime , включая и исключая смещения часового пояса, летнее время и т. Д.

  • Мы также можем отобразить перечисления ; мы можем сопоставить их со строками или их базовыми числовыми значениями.

Все, начиная от простых числовых типов и заканчивая строками, которые можно отображать различными способами, используя varchars, chars и т. Д., А также строковые объекты и все разнообразие типов, поддерживаемых базами данных.

Он также может отображать логические поля, как поля, использующие нули, так и поля, символьные поля, которые содержат истину, ложь или T и F.

Существует множество способов определения того, как это отображается на бэкэнд, логические значения в базе данных.

Мы можем обрабатывать отображение DateTime , включая и исключая смещения часового пояса, летнее время и т. Д.

Мы также можем отобразить перечисления ; мы можем сопоставить их со строками или их базовыми числовыми значениями.

Давайте рассмотрим простой пример, в котором у нас есть одинаковые имена свойств как в базе данных, так и в классе Student.

Теперь давайте изменим FirstMidName на FirstName в классе ученика, где мы не будем изменять столбец FirstMidName, но мы увидим, как сообщить NHibernate, что нужно выполнить это преобразование. Следующее — обновленный студенческий класс.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks;

namespace NHibernateDemoApp { 
  
   class Student { 
      public virtual int ID { get; set; } 
      public virtual string LastName { get; set; } 
      public virtual string FirstName { get; set; } 
   }
}

Вот реализация файла сопоставления NHibernate.

<?xml version = "1.0" encoding = "utf-8" ?> 
<hibernate-mapping xmlns = "urn:nhibernate-mapping-2.2" assembly = "NHibernateDemoApp" 
   namespace = "NHibernateDemoApp"> 
   
   <class name = "Student">
	
      <id name = "ID"> 
         <generator class = "native"/>
      </id> 
   
      <property name = "LastName"/> 
      <property name = "FirstName" column = "FirstMidName" type = "String"/> 
   </class> 

</hibernate-mapping>

В этом примере предположим, что поле FirstName является строкой .NET, а столбец FirstMidName является SQL nvarchar . Теперь, чтобы сообщить NHibernate, как выполнить это преобразование, установите имя, равное FirstName, и столбец, равный FirstMidName, и укажите тип отображения, равный String, который подходит для этого конкретного преобразования.

Ниже приведена реализация файла Program.cs .

using HibernatingRhinos.Profiler.Appender.NHibernate; 
using NHibernate.Cfg; 
using NHibernate.Dialect; 
using NHibernate.Driver; 

using System; 
using System.Linq; 
using System.Reflection;

namespace NHibernateDemoApp { 

   class Program { 
	
      static void Main(string[] args) { 
		
         NHibernateProfiler.Initialize(); 
         var cfg = new Configuration(); 
			
         String Data Source = asia13797\\sqlexpress;
         String Initial Catalog = NHibernateDemoDB;
         String Integrated Security = True;
         String Connect Timeout = 15;
         String Encrypt = False;
         String TrustServerCertificate = False;
         String ApplicationIntent = ReadWrite;
         String MultiSubnetFailover = False;
         
         cfg.DataBaseIntegration(x = > { x.ConnectionString = "Data Source + 
            Initial Catalog + Integrated Security + Connect Timeout + Encrypt +
            TrustServerCertificate + ApplicationIntent + MultiSubnetFailover"; 
            
            x.Driver<SqlClientDriver>(); 
            x.Dialect<MsSql2008Dialect>(); 
            x.LogSqlInConsole = true; 
         }); 
         
         cfg.AddAssembly(Assembly.GetExecutingAssembly()); 
         var sefact = cfg.BuildSessionFactory();
			
         using (var session = sefact.OpenSession()) { 
            
            using (var tx = session.BeginTransaction()) { 
               var students = session.CreateCriteria<Student>().List<Student>(); 
               Console.WriteLine("\nFetch the complete list again\n"); 
               
               foreach (var student in students) { 
                  Console.WriteLine("{0} \t{1} \t{2}", student.ID, student.FirstName,
                     student.LastName); 
               } 
					
               tx.Commit(); 
            } 
				
            Console.ReadLine(); 
         } 
      } 
   }
}

Теперь, когда вы запустите ваше приложение, вы увидите следующий вывод.

NHibernate: SELECT this_.ID as ID0_0_, this_.LastName as LastName0_0_, 
   this_.FirstMidName as FirstMid3_0_0_ FROM Student this_

Fetch the complete list again
3 Allan Bommer
4 Jerry Lewis

Как вы можете видеть, он сопоставил другое имя свойства с именем столбца в базе данных.

Давайте рассмотрим другой пример, в котором мы добавим еще одно свойство в класс Student типа enum . Вот реализация студенческого класса.

using System; 
using System.Collections.Generic; 
using System.Linq; using System.Text; 
using System.Threading.Tasks; 

namespace NHibernateDemoApp { 
   
   class Student { 
      public virtual int ID { get; set; } 
      public virtual string LastName { get; set; } 
      public virtual string FirstName { get; set; } 
      public virtual StudentAcademicStanding AcademicStanding { get; set; } 
   } 
   
   public enum StudentAcademicStanding { 
      Excellent, 
      Good, 
      Fair, 
      Poor, 
      Terrible 
   } 
}

Как вы можете видеть, перечисление имеет множество различных значений, которые оно может иметь, например, Отлично, Хорошо, Удовлетворительно, Плохо и Ужасно.

Перейдя к файлу сопоставления, вы увидите, что каждое из этих свойств перечислено в файле сопоставления, включая недавно добавленное свойство AcademicStanding .

<?xml version = "1.0" encoding = "utf-8" ?> 
<hibernate-mapping xmlns = "urn:nhibernate-mapping-2.2" 
   assembly = "NHibernateDemoApp" namespace = "NHibernateDemoApp"> 
   
   <class name = "Student"> 
	
      <id name = "ID"> 
         <generator class = "native"/> 
      </id> 

      <property name = "LastName"/> 
      <property name = "FirstName" column = "FirstMidName" type = "String"/> 
      <property name = "AcademicStanding"/> 
   </class>  

</hibernate-mapping>

Теперь нам также нужно изменить базу данных, поэтому перейдите в проводник объектов SQL Server, щелкните правой кнопкой мыши базу данных и выберите опцию Новый запрос….

Новый запрос

Он откроет редактор запросов и затем укажет следующий запрос.

DROP TABLE [dbo].[Student]

CREATE TABLE [dbo].[Student] ( 
   [ID] INT IDENTITY (1, 1) NOT NULL, 
   [LastName] NVARCHAR (MAX) NULL, 
   [FirstMidName] NVARCHAR (MAX) NULL, 
   [AcademicStanding] NCHAR(10) NULL, 
   CONSTRAINT [PK_dbo.Student] PRIMARY KEY CLUSTERED ([ID] ASC) 
);

Этот запрос сначала удалит существующую таблицу учеников, а затем создаст новую таблицу.

Создать новую таблицу

Нажмите на значок Выполнить, как показано выше. После успешного выполнения запроса вы увидите сообщение.

Разверните базу данных и раскрывающийся список Таблица, затем щелкните правой кнопкой мыши таблицу Student и выберите View Designer.

Раскрывающийся стол

Теперь вы увидите вновь созданную таблицу, которая также имеет новое свойство AcademicStanding.

Академическое положение

Давайте добавим две записи, как показано в следующем файле Program.cs .

using HibernatingRhinos.Profiler.Appender.NHibernate; 
using NHibernate.Cfg; 
using NHibernate.Dialect; 
using NHibernate.Driver; 

using System; 
using System.Linq; 
using System.Reflection;

namespace NHibernateDemoApp { 

   class Program { 
      
      static void Main(string[] args) { 
		
         NHibernateProfiler.Initialize(); 
         var cfg = new Configuration(); 
			
         String Data Source = asia13797\\sqlexpress;
         String Initial Catalog = NHibernateDemoDB;
         String Integrated Security = True;
         String Connect Timeout = 15;
         String Encrypt = False;
         String TrustServerCertificate = False;
         String ApplicationIntent = ReadWrite;
         String MultiSubnetFailover = False;
         
         cfg.DataBaseIntegration(x = > { x.ConnectionString = "Data Source + 
            Initial Catalog + Integrated Security + Connect Timeout + 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, 
                  FirstName = "Allan", 
                  LastName = "Bommer",
                  AcademicStanding = StudentAcademicStanding.Excellent 
               };
               
               var student2 = new Student { 
                  ID = 2, 
                  FirstName = "Jerry", 
                  LastName = "Lewis", 
                  AcademicStanding = StudentAcademicStanding.Good 
               };
					
               session.Save(student1); 
               session.Save(student2);
               var students = session.CreateCriteria<Student>().List<Student>(); 
               Console.WriteLine("\nFetch the complete list again\n");
               
               foreach (var student in students) { 
                  Console.WriteLine("{0} \t{1} \t{2} \t{3}", student.ID,
                     student.FirstName, student.LastName, student.AcademicStanding); 
               } 
					
               tx.Commit(); 
            }
				
            Console.ReadLine(); 
         } 
      } 
   } 
}

Теперь давайте запустим ваше приложение, и вы увидите следующий вывод в окне консоли.

Fetch the complete list again

1 Allan Bommer Excellent
2 Jerry Lewis Good

Теперь давайте посмотрим на базу данных, щелкнув правой кнопкой мыши на Студенческий стол.

База данных

Выберите Просмотр данных, и вы увидите две записи в таблице учеников, как показано на следующем снимке экрана.

Просмотр данных

Вы видите, что добавлены две записи, и у Аллана есть AcademicStanding 0, а у Джерри есть AcademicStanding 1. Это потому, что в .Net первое значение перечисления по умолчанию имеет 0, что отлично, если вы посмотрите на StudentAcademicStanding . Принимая во внимание, что в файле Student.cs «Good» является вторым, поэтому он имеет значение 1.