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.