NHibernate - Datentypzuordnung

In diesem Kapitel werden Mapping-Datentypen behandelt. Das Zuordnen von Entitäten ist unkompliziert. Entitätsklassen werden immer mithilfe von Datenbanktabellen zugeordnet<class>, <subclass>, and <joined-subclass>Zuordnungselemente. Werttypen benötigen etwas mehr. Hier sind Zuordnungstypen erforderlich.

NHibernate kann eine Vielzahl von Datentypen abbilden. Hier ist die Liste der gängigsten Datentypen, die unterstützt werden.

Zuordnungstyp .NET-Typ System.Data.DbType
Int16 System.Int16 DbType.Int16
Int32 System.Int32 DbType.Int32
Int64 System.Int64 DbType.Int64
Single System.Single DbType.Single
Doppelt System.Double DbType.Double
Dezimal System.Decimal DbType.Decimal
String System.String DbType.String
AnsiString System.String DbType.AnsiString
Byte System.Byte DbType.Byte
Verkohlen System.Char DbType.StringFixedLength - ein Zeichen
AnsiChar System.Char DbType.AnsiStringFixedLength - ein Zeichen
Boolescher Wert System.Boolean DbType.Boolean
Guid System.Guid DbType.Guid
PersistentEnum System.Enum (eine Aufzählung) DbType für den zugrunde liegenden Wert
Wahr falsch System.Boolean DbType.AnsiStringFixedLength - entweder 'T' oder 'F'
Ja Nein System.Boolean DbType.AnsiStringFixedLength - entweder 'Y' oder 'N'
Terminzeit Terminzeit DbType.DateTime - ignoriert Millisekunden
Zecken System.DateTime DbType.Int64
Zeitspanne System.TimeSpan DbType.Int64
Zeitstempel System.DateTime DbType.DateTime - so spezifisch, wie es die Datenbank unterstützt
Binär System.Byte [] DbType.Binary
BinaryBlob System.Byte [] DbType.Binary
StringClob System.String DbType.String
Serialisierbar Jedes System.Object, das mit SerializableAttribute markiert ist DbType.Binary
CultureInfo System.Globalization.CultureInfo DbType.String - fünf Zeichen für Kultur
Art Systemtyp DbType.String mit dem qualifizierten Namen der Assembly

In der oben angegebenen Tabelle werden die unten genannten Hinweise ausführlich erläutert.

  • Alles von einfachen numerischen Typen bis hin zu Zeichenfolgen, die auf verschiedene Arten zugeordnet werden können varchars, chars usw. sowie String-Blobs und die Vielzahl der von Datenbanken unterstützten Typen.

  • Es ist auch in der Lage zu kartieren Booleans, sowohl für Felder mit Nullen als auch für Einsen, Zeichenfelder, die wahr, falsch oder T und F enthalten.

  • Es gibt eine Vielzahl von Möglichkeiten zu definieren, wie diese dem Back-End zugeordnet werden, boolesche Werte in der Datenbank.

  • Wir können mit der Zuordnung von umgehen DateTime, einschließlich und ohne Zeitzonenversätze, Sommerzeit usw.

  • Wir können auch kartieren enumerations;; Wir können diese Zeichenfolgen oder ihren zugrunde liegenden numerischen Werten zuordnen.

Schauen wir uns ein einfaches Beispiel an, in dem wir sowohl in der Datenbank als auch in der Student-Klasse dieselben Eigenschaftsnamen haben.

Lassen Sie uns nun den FirstMidName in der Schülerklasse in FirstName ändern, wobei wir die FirstMidName-Spalte nicht ändern, aber wir werden sehen, wie NHibernate weiß, dass diese Konvertierung durchgeführt werden soll. Es folgt die aktualisierte Schülerklasse.

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; } 
   }
}

Hier ist die Implementierung der NHibernate-Zuordnungsdatei.

<?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>

In diesem Beispiel wird davon ausgegangen, dass das Feld Vorname eine .NET-Zeichenfolge und die Spalte Vorname eine ist SQL nvarchar. Um NHibernate nun mitzuteilen, wie diese Konvertierung durchgeführt werden soll, setzen Sie den Namen aufFirstName und Spalte gleich FirstMidName und geben Sie den Zuordnungstyp gleich String an, der für diese bestimmte Konvertierung geeignet ist.

Das Folgende ist a Program.cs Dateiimplementierung.

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(); 
         } 
      } 
   }
}

Wenn Sie nun Ihre Anwendung ausführen, wird die folgende Ausgabe angezeigt.

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

Wie Sie sehen, wurde der unterschiedliche Eigenschaftsname dem Spaltennamen in der Datenbank zugeordnet.

Schauen wir uns ein anderes Beispiel an, in dem wir der Student-Klasse von eine weitere Eigenschaft hinzufügen enumArt. Hier ist die Implementierung der Schülerklasse.

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 
   } 
}

Wie Sie sehen können, hat die Aufzählung eine Vielzahl unterschiedlicher Werte, die sie möglicherweise haben kann, wie z. B. Ausgezeichnet, Gut, Fair, Schlecht und Schrecklich.

Wenn Sie zur Zuordnungsdatei springen, sehen Sie, dass jede dieser Eigenschaften in der Zuordnungsdatei aufgeführt ist, einschließlich der neu hinzugefügten AcademicStanding Eigentum.

<?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>

Jetzt müssen wir auch die Datenbank ändern. Gehen Sie also zum SQL Server-Objekt-Explorer, klicken Sie mit der rechten Maustaste auf die Datenbank und wählen Sie die Option Neue Abfrage….

Der Abfrageeditor wird geöffnet und die folgende Abfrage angegeben.

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) 
);

Diese Abfrage löscht zuerst die vorhandene Schülertabelle und erstellt dann eine neue Tabelle.

Klicken Sie wie oben gezeigt auf das Symbol Ausführen. Sobald die Abfrage erfolgreich ausgeführt wurde, wird eine Meldung angezeigt.

Erweitern Sie die Dropdown-Liste Datenbank und Tabelle, klicken Sie mit der rechten Maustaste auf die Schülertabelle und wählen Sie View Designer.

Jetzt sehen Sie die neu erstellte Tabelle, die auch die neue Eigenschaft AcademicStanding hat.

Fügen wir zwei Datensätze hinzu, wie im Folgenden gezeigt Program.cs Datei.

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(); 
         } 
      } 
   } 
}

Lassen Sie uns nun Ihre Anwendung ausführen und Sie werden die folgende Ausgabe in Ihrem Konsolenfenster sehen.

Fetch the complete list again

1 Allan Bommer Excellent
2 Jerry Lewis Good

Schauen wir uns nun die Datenbank an, indem Sie mit der rechten Maustaste auf die Schülertabelle klicken.

Wählen Sie Daten anzeigen und Sie sehen die beiden Datensätze in der Schülertabelle, wie im folgenden Screenshot gezeigt.

Sie können sehen, dass zwei Datensätze hinzugefügt wurden und Allan AcademicStanding 0 und Jerry AcademicStanding 1 hat. Dies liegt daran, dass in .Net der erste Aufzählungswert standardmäßig 0 hat, was bei Betrachtung ausgezeichnet ist StudentAcademicStanding. Während in der Student.cs-Datei Good die zweite ist, hat sie den Wert 1.