NHibernate - Veri Türleri Eşleme
Bu bölümde, haritalama veri türlerini ele alacağız. Varlıkları eşlemek basittir, varlık sınıfları her zaman veritabanı tablolarıyla eşlenir.<class>, <subclass>, and <joined-subclass>eşleme öğeleri. Değer türleri daha fazlasına ihtiyaç duyar, bu da eşleme türlerinin gerekli olduğu yerdir.
NHibernate, çok çeşitli veri türlerini eşleyebilir. Desteklenen en yaygın veri türlerinin listesi aşağıdadır.
Eşleme türü | .NET türü | System.Data.DbType |
---|---|---|
Int16 | System.Int16 | DbType.Int16 |
Int32 | System.Int32 | DbType.Int32 |
Int64 | System.Int64 | DbType.Int64 |
Tek | System.Single | DbType.Single |
Çift | System.Double | DbType.Double |
Ondalık | System.Decimal | DbType.Decimal |
Dize | System.String | DbType.String |
AnsiString | System.String | DbType.AnsiString |
Bayt | System.Byte | DbType.Byte |
Char | System.Char | DbType.StringFixedLength — bir karakter |
AnsiChar | System.Char | DbType.AnsiStringFixedLength — bir karakter |
Boole | System.Boolean | DbType.Boolean |
Kılavuz | System.Guid | DbType.Guid |
PersistentEnum | System.Enum (bir numaralandırma) | Temel değer için DbType |
Doğru yanlış | System.Boolean | DbType.AnsiStringFixedLength - 'T' veya 'F' |
Evet Hayır | System.Boolean | DbType.AnsiStringFixedLength - 'Y' veya 'N' |
DateTime | DateTime | DbType.DateTime — milisaniyeleri dikkate almaz |
Keneler | System.DateTime | DbType.Int64 |
Zaman aralığı | System.TimeSpan | DbType.Int64 |
Zaman damgası | System.DateTime | DbType.DateTime - veritabanının desteklediği kadar spesifik |
İkili | System.Byte [] | DbType.Binary |
BinaryBlob | System.Byte [] | DbType.Binary |
StringClob | System.String | DbType.String |
Serileştirilebilir | SerializableAttribute ile işaretlenmiş herhangi bir System.Object | DbType.Binary |
CultureInfo | System.Globalization.CultureInfo | DbType.String — kültür için beş karakter |
Tür | Sistem tipi | Derleme Nitelikli Adını tutan DbType.String |
Yukarıda verilen tablo, aşağıda belirtilen noktaları ayrıntılı olarak açıklamaktadır.
Basit sayısal türlerden, çeşitli şekillerde eşlenebilen dizelere kadar her şey varchars, chars vb. yanı sıra dize blobları ve veritabanlarının desteklediği tüm türler.
Ayrıca harita yapabiliyor Booleans, hem sıfır hem de birler kullanan alanlara, doğru, yanlış veya T ve F içeren karakter alanlarına.
Veritabanındaki arka uç, boole değerleriyle nasıl eşleştiğini tanımlamanın çok çeşitli yolları vardır.
Haritalandırmayı halledebiliriz DateTimesaat dilimi uzaklıkları, gün ışığından yararlanma saati vb. dahil ve hariç
Ayrıca haritalayabiliriz enumerations; bunları dizelerle veya onların temelindeki sayısal değerlerle eşleyebiliriz.
Hem veritabanında hem de Öğrenci sınıfında aynı özellik adlarına sahip olduğumuz basit bir örneğe bakalım.
Şimdi öğrenci sınıfında FirstMidName'i FirstName olarak değiştirelim, burada FirstMidName sütununu değiştirmeyeceğiz, ancak NHibernate'e bu dönüşümü gerçekleştireceğini nasıl söyleyeceğimizi göreceğiz. Güncellenen öğrenci sınıfı aşağıdadır.
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 eşleme dosyasının uygulaması burada.
<?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>
Bu örnekte, FirstName alanının bir .NET dizesi ve FirstMidName sütununun bir SQL nvarchar. Şimdi NHibernate'e bu dönüşümü nasıl gerçekleştireceğini söylemek için adı şuna eşit ayarlayın:FirstName ve sütun eşittir FirstMidName ve bu özel dönüştürme için uygun olan, String'e eşit eşleme türünü belirtin.
Aşağıdaki bir Program.cs dosya uygulaması.
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();
}
}
}
}
Şimdi uygulamanızı çalıştırdığınızda aşağıdaki çıktıyı göreceksiniz.
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
Gördüğünüz gibi, farklı özellik adını veritabanındaki sütun adıyla eşlemiş.
Öğrenci sınıfına başka bir özellik ekleyeceğimiz başka bir örneğe bakalım. enumyazın. İşte Öğrenci sınıfı uygulaması.
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
}
}
Gördüğünüz gibi numaralandırmanın sahip olabileceği, Mükemmel, İyi, Orta, Zayıf ve Korkunç gibi çeşitli farklı değerleri vardır.
Eşleme dosyasına atladığınızda, bu özelliklerin her birinin yeni eklenenler de dahil olmak üzere eşleme dosyasında listelendiğini görebilirsiniz. AcademicStanding Emlak.
<?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>
Şimdi ayrıca veritabanını da değiştirmemiz gerekiyor, bu yüzden SQL Server Object Explorer'a gidin ve veritabanına sağ tıklayın ve Yeni Sorgu… seçeneğini seçin.
Sorgu düzenleyicisini açacak ve ardından aşağıdaki sorguyu belirleyecektir.
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)
);
Bu sorgu önce mevcut öğrenci tablosunu kaldıracak ve ardından yeni bir tablo oluşturacaktır.
Yukarıda gösterildiği gibi Yürüt simgesine Clcik. Sorgu başarıyla yürütüldüğünde bir mesaj görürsünüz.
Veritabanı ve Tablo açılır menüsünü genişletin ve ardından Öğrenci tablosuna sağ tıklayın ve Tasarımcıyı Görüntüle'yi seçin.
Şimdi, yeni oluşturulmuş ve AcademicStanding özelliğine sahip olan tabloyu göreceksiniz.
Aşağıda gösterildiği gibi iki kayıt ekleyelim Program.cs dosya.
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();
}
}
}
}
Şimdi uygulamanızı çalıştıralım ve konsol pencerenizde aşağıdaki çıktıyı göreceksiniz.
Fetch the complete list again
1 Allan Bommer Excellent
2 Jerry Lewis Good
Şimdi Öğrenci Tablosu'na sağ tıklayarak veri tabanına bakalım.
Verileri Görüntüle'yi seçin ve aşağıdaki ekran görüntüsünde gösterildiği gibi öğrenci tablosunda iki kaydı göreceksiniz.
İki kaydın eklendiğini ve Allan'ın AcademicStanding 0'a ve Jerry'nin AcademicStanding 1'e sahip olduğunu görebilirsiniz. Bunun nedeni, .Net'te varsayılan olarak ilk numaralandırma değerinin 0'a sahip olmasıdır; StudentAcademicStanding. Oysa Student.cs dosyasında İyi ikinci dosyadır, dolayısıyla değeri 1'dir.