NHibernate - 数据类型映射

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

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

映射类型.NET类型System.Data.DbType
Int16System.Int16DbType.Int16
Int32System.Int32DbType.Int32
Int64System.Int64DbType.Int64
SingleSystem.SingleDbType.Single
DoubleSystem.DoubleDbType.Double
十进制System.DecimalDbType.Decimal
StringSystem.StringDbType.String
AnsiStringSystem.StringDbType.AnsiString
字节System.ByteDbType .Byte
CharSystem.CharDbType.StringFixedLength-一个字符
AnsiChar系统. CharDbType.AnsiStringFixedLength-one character
BooleanSystem.BooleanDbType.Boolean
GuidSystem.GuidDbType.Guid
PersistentEnumSystem.Enum(枚举)基础值的DbType
TrueFalseSystem.BooleanDbType.AnsiStringFixedLength-"T"或'F'
YesNoSystem.BooleanD. bType.AnsiStringFixedLength-'Y'或'N'
DateTimeDateTimeDbType.DateTime-忽略毫秒
TicksSystem.DateTimeDbType.Int64
TimeSpanSystem.TimeSpanDbType.Int64
TimestampSystem.DateTimeDbType.DateTime-具体与数据库支持
BinarySystem.Byte []DbType.Binary
BinaryBlobSystem.Byte []DbType.Binary
StringClobSystem.StringDbType.String
Serializable任何系统.用SerializableAttribute标记的对象DbType.Binary
Cu ltureInfoSystem.Globalization.CultureInfoDbType.String-文化的五个字符
TypeSystem.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.