在本章中,我们将介绍映射数据类型.映射实体很简单,实体类总是使用< class>,< subclass>和< joined-subclass> 映射元素映射到数据库表.值类型需要更多,这是需要映射类型的地方.
NHibernate能够映射各种各样的数据类型.以下是支持的最常见数据类型列表.
映射类型 | .NET类型 | System.Data.DbType |
---|---|---|
Int16 | System.Int16 | DbType.Int16 |
Int32 | System.Int32 | DbType.Int32 |
Int64 | System.Int64 | DbType.Int64 |
Single | System.Single | DbType.Single |
Double | System.Double | DbType.Double |
十进制 | System.Decimal | DbType.Decimal |
String | System.String | DbType.String |
AnsiString | System.String | DbType.AnsiString |
字节 | System.Byte | DbType .Byte |
Char | System.Char | DbType.StringFixedLength-一个字符 |
AnsiChar | 系统. Char | DbType.AnsiStringFixedLength-one character |
Boolean | System.Boolean | DbType.Boolean |
Guid | System.Guid | DbType.Guid |
PersistentEnum | System.Enum(枚举) | 基础值的DbType |
TrueFalse | System.Boolean | DbType.AnsiStringFixedLength-"T"或'F' |
YesNo | System.Boolean | D. bType.AnsiStringFixedLength-'Y'或'N' |
DateTime | DateTime | DbType.DateTime-忽略毫秒 |
Ticks | System.DateTime | DbType.Int64 |
TimeSpan | System.TimeSpan | DbType.Int64 |
Timestamp | System.DateTime | DbType.DateTime-具体与数据库支持 |
Binary | System.Byte [] | DbType.Binary |
BinaryBlob | System.Byte [] | DbType.Binary |
StringClob | System.String | DbType.String |
Serializable | 任何系统.用SerializableAttribute标记的对象 | DbType.Binary |
Cu ltureInfo | System.Globalization.CultureInfo | DbType.String-文化的五个字符 |
Type | System.Type | 持有程序集限定名称的DbType.String |
上面给出的表格详细解释了下面提到的指针.
从简单的数字类型到字符串的所有内容,可以使用 varchars,chars 等以各种方式映射,以及字符串blob和所有种类数据库支持的类型.
它还可以将布尔映射到使用零和1的字段,字符字段包含true,false或T和F.
有多种方法可以定义映射到后端的方式,即数据库中的布尔值./p>
我们可以处理 DateTime 的映射,包括和排除时区偏移,日光avings time等.
我们还可以映射枚举;我们可以将这些映射到字符串或它们的基础数值.
让我们看一个我们有相同的简单示例数据库和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类中添加另一个属性类型.这是Student类的实现.
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) );
此查询将首先删除现有的学生表,然后创建一个新表.
Clcik,如上所示.成功执行查询后,您会看到一条消息.
展开数据库和表下拉列表,然后右键单击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
现在让我们通过右键单击学生表来查看数据库.
选择查看数据,您将在学生表中看到两条记录,如以下屏幕截图所示.
您可以看到添加了两条记录,Allan拥有AcademicStanding 0和Jerry已经AcademicStanding 1.这是因为在.Net中,默认情况下第一个枚举值为0,如果你看 StudentAcademicStanding ,这是优秀的.然而,在Student.cs文件中,Good是第二个,因此它的值为1.