📜  NHibernate-数据类型映射

📅  最后修改于: 2020-11-19 05:34:04             🧑  作者: Mango


在本章中,我们将介绍映射数据类型。映射实体非常简单,实体类始终使用映射元素映射到数据库表。值类型需要更多的东西,这是需要映射类型的地方。

NHibernate能够映射各种各样的数据类型。这是受支持的最常见数据类型的列表。

Mapping type .NET type 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
Decimal System.Decimal DbType.Decimal
String System.String DbType.String
AnsiString System.String DbType.AnsiString
Byte System.Byte DbType.Byte
Char System.Char DbType.StringFixedLength—one character
AnsiChar System.Char DbType.AnsiStringFixedLength—one character
Boolean System.Boolean DbType.Boolean
Guid System.Guid DbType.Guid
PersistentEnum System.Enum(an enumeration) DbType for the underlying value
TrueFalse System.Boolean DbType.AnsiStringFixedLength—either ‘T’ or ‘F’
YesNo System.Boolean DbType.AnsiStringFixedLength—either ‘Y’ or ‘N’
DateTime DateTime DbType.DateTime—ignores milliseconds
Ticks System.DateTime DbType.Int64
TimeSpan System.TimeSpan DbType.Int64
Timestamp System.DateTime DbType.DateTime—as specific as the database supports
Binary System.Byte[] DbType.Binary
BinaryBlob System.Byte[] DbType.Binary
StringClob System.String DbType.String
Serializable Any System.Object marked with SerializableAttribute DbType.Binary
CultureInfo System.Globalization.CultureInfo DbType.String—five characters for culture
Type System.Type DbType.String holding the Assembly Qualified Name

上面给出的表格详细说明了以下提到的指针。

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

  • 它还能够将布尔值映射到使用零和一的字段,即包含true,false或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映射文件的实现。

 
 
   
   
    
       
         
       
   
       
       
    


在此示例中,假定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(); 
            x.Dialect(); 
            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().List(); 
               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类中添加另一个属性。这是学生类的实现。

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属性。

 
 
   
    
    
       
          
       

       
       
       
     


现在我们还需要更改数据库,因此请转到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) 
);

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

创建新表

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

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

表格下拉

现在,您将看到新创建的表,该表还具有新属性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(); 
            x.Dialect(); 
         }); 
         
         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().List(); 
               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具有AcademicStanding1。这是因为在.Net中,默认情况下,第一个枚举值具有0,如果您查看StudentAcademicStanding ,则它为优秀。而在Student.cs文件中,Good是第二个文件,因此其值为1。