NHibernate-매핑 구성 요소
이 장에서는 구성 요소 매핑에 대해 설명합니다. NHibernate에서component is a value object. 고유 한 정체성이 없습니다.
예를 들어 돈 물건, 지갑 또는 지갑에 돈이있을 수 있지만 그 돈의 정확한 신원은 관련이 없습니다.
자체 기본 키는 없지만 구성 요소 자체는 소유 개체와 동일한 테이블에 영구적입니다.
학생이 주소를 가지고있는 간단한 예를 살펴 보겠습니다. Location class 그것과 관련된.
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 virtual Location Address { get; set; }
}
public class Location {
public virtual string Street { get; set; }
public virtual string City { get; set; }
public virtual string Province { get; set; }
public virtual string Country { get; set; }
}
public enum StudentAcademicStanding {
Excellent,
Good,
Fair,
Poor,
Terrible
}
}
이제 다음 쿼리를 실행하여 데이터베이스를 업데이트해야합니다.이 쿼리는 먼저 Student 테이블을 삭제 한 다음 Location 클래스에 대한 열도 포함 할 새 테이블을 만듭니다.
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,
[Street] NVARCHAR (100) NULL,
[City] NVARCHAR (100) NULL,
[Province] NVARCHAR (100) NULL,
[Country] NVARCHAR (100) NULL,
CONSTRAINT [PK_dbo.Student] PRIMARY KEY CLUSTERED ([ID] ASC)
);
이제 Student 클래스의 일부가 아니지만 Location 클래스의 속성이며 Location 클래스 개체가 학생 클래스에 정의되어있는 열을 매핑합니다. 올바르게 매핑하려면 구성 요소가 필요합니다. 구성 요소를 만들어 보겠습니다.student.hbm.xml 다음 코드와 같이 파일.
<?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"/>
<component name = "Address">
<property name = "Street"/>
<property name = "City"/>
<property name = "Province"/>
<property name = "Country"/>
</component>
</class>
</hibernate-mapping>
이 구성 요소는 주소이며 다른 속성을 가지고 있습니다. 이 정보를 통해 NHibernate는 실제로이를 매핑 할 수있는 충분한 정보를 제공합니다.
이제 여기에 새 학생 개체가 만들어지고 초기화 된 다음 데이터베이스에 저장되는 Program.cs 파일이 있습니다. 그런 다음 데이터베이스에서 목록을 검색합니다.
using HibernatingRhinos.Profiler.Appender.NHibernate;
using NHibernate.Cache;
using NHibernate.Caches.SysCache;
using NHibernate.Cfg;
using NHibernate.Dialect;
using NHibernate.Driver;
using NHibernate.Linq;
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.Poor,
Address = new Location {
Street = "123 Street",
City = "Lahore",
Province = "Punjab",
Country = "Pakistan"
}
};
session.Save(student1);
tx.Commit();
var students = session.Query<Student>().ToList<Student>();
Console.WriteLine("\nFetch the complete list again\n");
foreach (var student in students) {
Console.WriteLine("{0} \t{1} \t{2} \t{3} \t{4} \t{5} \t{6} \t{7}",
student.ID,
student.FirstName,
student.LastName,
student.AcademicStanding,
student.Address.Street,
student.Address.City,
student.Address.Province,
student.Address.Country
);
}
}
Console.ReadLine();
}
}
}
}
이제이 응용 프로그램을 실행할 수 있으며 NHibernate는 이러한 값을 데이터베이스에 저장할 수 있습니다. 애플리케이션을 실행하면 다음 출력이 표시됩니다.
Fetch the complete list again
2 Allan Bommer Poor 123 Street Lahore Punjab Pakistan
다음은 데이터베이스의 값입니다.
구성 요소를 사용하면 데이터베이스 테이블에있는 열을 별도의 클래스로 분리 할 수 있습니다.
여기서 주목해야 할 또 다른 점은 Location이 클래스이고 엔티티가 아니기 때문입니다.
값 유형 객체이며 자체 기본 키가 없습니다.
그것은 그것을 포함하는 Student와 같은 테이블에 저장됩니다.
이것이 우리가 여기서 컴포넌트를 사용하는 이유입니다.
이를 통해 클래스 레이어, 클래스 정의 방법 및 데이터베이스 레이아웃 방법을 유연하게 변경할 수 있습니다.