开发手册 欢迎您!
软件开发者资料库

NHibernate - 数据类型映射

NHibernate数据类型映射 - 从概述,架构,Orm,环境设置,入门,基本Orm,基本Crud操作,Profiler,添加Intelliesnse到映射文件,数据类型映射,配置,覆盖配置,批量大小,缓存,学习NHibernate映射组件,关系,集合映射,级联,延迟加载,反向关系,加载/获取,Linq,Hibernate查询语言,条件查询,QueryOver查询,本机Sql,流利Hibernate。

在本章中,我们将介绍映射数据类型.映射实体很简单,实体类总是使用< 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映射文件的实现.

                                                    

在此示例中,假设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 again3 Allan Bommer4 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 属性.

                                                           

现在我们还需要更改数据库,所以转到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();             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 again1 Allan Bommer Excellent2 Jerry Lewis Good

现在让我们通过右键单击学生表来查看数据库.

数据库

选择查看数据,您将在学生表中看到两条记录,如以下屏幕截图所示.

查看数据

您可以看到添加了两条记录,Allan拥有AcademicStanding 0和Jerry已经AcademicStanding 1.这是因为在.Net中,默认情况下第一个枚举值为0,如果你看 StudentAcademicStanding ,这是优秀的.然而,在Student.cs文件中,Good是第二个,因此它的值为1.