NHibernate – 数据类型映射

NHibernate – 数据类型映射


在本章中,我们将介绍映射数据类型。映射实体很简单,实体类总是使用<class>、<subclass> 和 <joined-subclass>映射元素映射到数据库表值类型需要更多东西,这就是需要映射类型的地方。

NHibernate 能够映射多种数据类型。以下是支持的最常见数据类型的列表。

Mapping type .NET 类型 系统.Data.DbType
Int16 System.Int16 数据库类型.Int16
Int32 System.Int32 数据库类型.Int32
Int64 System.Int64 数据库类型.Int64
Single 单系统 DbType.Single
Double 双系统 DbType.Double
Decimal 系统.十进制 DbType.Decimal
String 系统字符串 数据库类型.字符串
AnsiString 系统字符串 数据库类型.AnsiString
Byte 系统字节 数据库类型.Byte
Char 系统字符 DbType.StringFixedLength——一个字符
AnsiChar 系统字符 DbType.AnsiStringFixedLength——一个字符
Boolean 系统布尔值 DbType.Boolean
Guid 系统向导 数据库类型.Guid
PersistentEnum System.Enum(一个枚举) 基础值的 DbType
TrueFalse 系统布尔值 DbType.AnsiStringFixedLength – ‘T’ 或 ‘F’
YesNo 系统布尔值 DbType.AnsiStringFixedLength – ‘Y’ 或 ‘N’
DateTime 约会时间 DbType.DateTime—忽略毫秒
Ticks 系统日期时间 数据库类型.Int64
TimeSpan 系统时间跨度 数据库类型.Int64
Timestamp 系统日期时间 DbType.DateTime — 与数据库支持的一样具体
Binary System.Byte[] 数据库类型.Binary
BinaryBlob System.Byte[] 数据库类型.Binary
StringClob 系统字符串 数据库类型.字符串
Serializable 任何用 SerializableAttribute 标记的 System.Object 数据库类型.Binary
CultureInfo 系统.全球化.文化信息 DbType.String——五个字符用于文化
Type 系统类型 保存程序集限定名称的 DbType.String

上面给出的表格详细解释了下面提到的指针。

  • 从简单的数字类型到字符串,一切都可以使用varchars、chars等以多种方式映射,以及字符串 blob 和数据库支持的所有各种类型。

  • 它还能够将Booleans映射到使用零和一的字段、包含真、假或 T 和 F 的字符字段。

  • 有多种方法可以定义如何映射到数据库中的后端布尔值。

  • 我们可以处理DateTime的映射,包括和不包括时区偏移、夏令时等。

  • 我们还可以映射枚举我们可以将这些映射到字符串或它们的底层数值。

让我们看一个简单的例子,在这个例子中,我们在数据库和 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 如何进行这种转换,将 name 设置为FirstName和 column 等于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) 
);

此查询将首先删除现有的学生表,然后创建一个新表。

创建新表

单击 Execute 图标,如上所示。成功执行查询后,您会看到一条消息。

展开数据库和表下拉列表,然后右键单击学生表并选择查看设计器。

表格下拉

现在,您将看到新创建的表,该表还具有新属性 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。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁