.NET 的对象关系持久化机制(1)

原创 2004年03月04日 10:04:00

翻译的目的一是锻炼E文,二是为学些东西,如果这是有任何翻译问题,请通知我一声(mailto:wonderf2100@sina.com 或者 http://wonderf.blogone.net/)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

由于本人E文有限,错误还请包涵。

原文:http://www.15seconds.com/issue/040112.htm

关键字:ORP ObjectSpaces  对象 关系 持久

 

.NET 的对象关系持久化机制

第一章 关于一种新的数据访问方式

介绍

在几个星期前,.NET对象关系持久化(object-relational persistence for .NET)的爱好者还是屈指可数。他们认为,可以用一种专门的数据提供方式从应用程序中消除那些冗长的ADO.net代码和减少商业逻辑代码。事实上大多数的.NET开发者,希望可以少写些数据访问层(ADO.NET)的代码

如果你参加了PDC会议,你可以从许多线索中了解到Microsoft的一个新的数据访问策略。在whidbey和之后的visual studio 版本,将会大量增加ORP(对象关系持久化)功能。

令我惊喜的是有许多人参加了我和Dave Foderick主持的object-relational Birds of a Feather (BoF)会议。我原先期望会议 大约有10几位关注ORP的专业人士参与,讨论关于ORP,以及目前.NET OR 工具,聊聊各自的经验。出乎意料的是,有超过100位的人士参与了这次讨论。有支持者,反对者,一些感兴趣的人,甚至一些OR的工具厂商,气氛很热烈。整个下午,Microsoft ObjectSpaces team 在一个挤满人的房间里演示了ORP framework

对象关系这种能力并不是只用于ObjectSpaces.你可以在微软的下个SQL server 版本Yukon中找到很多ORobjectrelational)痕迹。Yukon 可以运行基于clr的代码,使用.net语言编写的存储过程和clr类型。业务对象可以通过ado.net的参数传递到存储过程,然后被.net存储过程代码分解成关系结构,除此之外,Yukon 表的 数据列可以是包含基于clr的复杂类型。假设这样的一种情况,一个业务对象作为参数被传递到Yukon,这个对象可以持久的作为一个列值被保存到数据库,要比分解成关系结构再存入数据库好的多。

假设在一个应用中,有一个Person类用来保存个人的简单信息,包括idnamebirthday

以下是这个Person sql server 2000 中的DDL定义

CREATE TABLE [dbo].[Person] (

[Id] [int] IDENTITY (1, 1) NOT NULL ,

 [Name] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,

 [Birthday] [datetime] NULL

) ON [PRIMARY]

而在Yukon中你可以这样写:

CREATE TABLE [dbo].[Person] (

[Id] [int] IDENTITY (1, 1) NOT NULL ,

[Person] [Person] NOT NULL

) ON [PRIMARY]

 

两者主要的不同之处是:Yukon DDL中含有一个Person类型的列,而Person.NET对象,显而易见,在Yukon中你可以直接定制一个.net对象类型的列。

 

     为了使这个column能容纳CLR类型,首先这个类型将被编译,然后安装到sql server。

         看一个person类的例子:

using System;

using System.Data.Sql;

using System.Data.SqlTypes;

using System.Runtime.Serialization;

 namespace ScottBellware.PersonExample

{

 /// <summary>

 /// Represents a Person.

 /// </summary>

 [Serializable]

 [SqlUserDefinedTypeAttribute(Format.UserDefined)]

 public class Person

 {

  private int id;

private string name;

private DateTime birthday;

  public int Id

 {

get{return this.id;}

set{this.id = value;}

}

 

 public string Name

 {

get{return this.name;}

set{this.name = value;}

}

 

public DateTime Birthday

{

get{return this.birthday;}

set{this.birthday = value;}

}

}

}

当这个类编译成dll文件后,你可以在sql server Yukon 中注册它,这是注册dllT-sql语句:

CREATE ASSEMBLY PersonExample FROM 'C:/Assemblies/ScottBellware.PersonExample.dll'

这样就在Yukon里创建了这个类,本质上是在Yukon里为这个类注册了个别名,yukon会引用这个包含在dll里的clr类型。在上面的DDL  表里定义了一个person类型的列,所以需要在Yukon中创建这个类型

创建的代码如下:

CREATE Type Person

EXTERNAL NAME [PersonExample]:Person

你可以使用带参数的DML语句向Person表里插入一个Person实例

INSERT INTO Person (Person) values (@Person)

如果你有使用ADO.NET 1.x DataParameter 对象的经验,上面的DML语句可能会引起你的好奇。在ADO .NET 1.0版本中,DataParameter 对象只可以包装标量值。上面的命令语句显示了在ADO .NET 2.0SqlParameter class的改变。你可以通过代码中往数据库传入复杂类型。

往数据库里传入一个定制的类型的所写代码式样类似于通过ADO .NET 1.x DataParameter objects.往数据库传入标量值。

ADO .NET 2.0中,SqlParameter 对象实例被通过引用传递,SqlParameter类新增了一个UdtTypeName属性。使用这个属性,来指定SqlParameter实例,用来传递复杂类型的 包装参数名字。同样,在SqlDbType 枚举类型里也增加了SqlDbType.Udt类型,来指定复杂类型或用户定义类型的值。

以下的例子示范了ADO.NET2.0客户端代码执行一个带有复杂参数的查询。假设已经存在一个名为connectionSqlConnection 对象实例和一个名为personPerson对象实例,同时数据库连接已经被打开。

// Create a command from the connection object.

SqlCommand insertCommand = conection.CreateCommand();

 

// Assign the DML to the command command text.

insertCommand.CommandText =  NSERT INTO Person (Person) values (@Person)?

 

// Parameter object to encapsulate the person instance.

SqlParameter parameter = insertCommand.Parameters.Add( Person? SqlDbTypes.Udt);

 

// Set the type name of the parameter encapsulated complex type.

parameter.UdtTypeName = cottBellware.PersonExample.Person?

 

// Assign the person instance to the parameter value.

parameter.Value = person;

 

// Execute the command.

command.ExecuteNonQuery();

从长远看,Longhorn 将在平台级别带给我们ORLonghorn的文件系统基于下一代的SQL Server技术,而ObjectSpaces将在其中扮演关键的角色,已经成为 Longhorn API 中的基本对象。

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />CSDN_Dev_Image_2004-3-22134250.png

你会在微软将要发布MBF中看到对象关系持久化机制。MBF提供抽象机制来描述业务对象和创建商业应用的业务过程,同时它也可以被ObjectSpaces保持持久化。

对象关系持久化在传统的数据访问中使用很少,而在.NET的数据访问模式和机制中得到应用。.NET的数据访问命令和结果通过数据访问层的api传递,即使这些是在对象关系持久的架构内。对象关系持久架构提取底层API 与ADO.NET提取底层的本地客户端库使用类似的方法,而通过更高级的抽象,客户端代码变得更清晰,可读。

 

细说Redis持久化机制

概述 Redis不仅可以作为缓存来使用,也可以作为内存数据库。Redis作为内存数据库使用时,必须要解决一个问题:数据的持久性。有些将Redis作为缓存使用的场景也需要将缓存的数据持久化到存储介质上...
  • hubin0011
  • hubin0011
  • 2014年05月07日 19:03
  • 1394

“戏”说Spark-Spark核心-RDD 持久化机制详解

RDD有一个叫持久化的机制,就是在不同操作间,持久化(或缓存)一个数据集在内存中。当你持久化一个RDD,每一个结点都将把它的计算分块结果保存在内存中,并在对此数据集(或者衍生出的数据集)进行的其它动作...
  • weixin_35602748
  • weixin_35602748
  • 2017年11月29日 17:06
  • 75

持久化机制:

redis是一个支持持久化的内存数据库,也就说redis需要经常将内存中的数据同步到硬盘来保证持久化 redis支持两种持久化方式: 1.snapshotting(快照)也是默认方式(将数据存以快...
  • wxloveyun
  • wxloveyun
  • 2015年07月17日 17:25
  • 230

MongoDB运行机制

MongoDB是用C++开发的,主要解决的是海量数据的访问效率问题。根据官方文档记载,当数据量达到50GB以上的时候,MongoDB的数据库访问速度是MySQL的10倍以上。MongoDB的并发读写效...
  • github_35124642
  • github_35124642
  • 2017年04月21日 16:29
  • 312

redis的持久化和缓存机制

说道redis,我们可能都会知道了他是一个类似缓存的一个内存数据库,我们从未感知到它的存在是因为他很快,为什么非常快,是因为他的发展到应用很快,还有他的反应速度也是非常快的。         上一篇文...
  • tr1912
  • tr1912
  • 2017年04月16日 23:54
  • 2058

redis的两种持久化机制:RDB和AOF介绍

redis 版本:3.0.7 Redis 持久化 Redis 提供了多种不同级别的持久化方式: RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time...
  • kexiaoling
  • kexiaoling
  • 2016年07月02日 15:38
  • 393

EF系列(三)——数据库持久化

什么是数据的持久化? 官方定义: 数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称. 数据模型可以是任何数据结构或对象模型,存储模型可以是关系模型、XML...
  • lnazj
  • lnazj
  • 2018年01月15日 17:08
  • 100

Redis入门之浅谈aof持久化机制

redis中的持久化策略之浅谈aof
  • candy_rainbow
  • candy_rainbow
  • 2016年10月12日 22:47
  • 799

RabbitMQ持久化机制

之前其实已经写过一篇关于RabbitMQ持久化的 文章 ,但那篇文章侧重代码层面的写入流程,对于持久化操作何时发生以及什么时候会刷新到磁盘等问题其实都没有搞清楚,这篇文章着重于关注这些问题。 消...
  • yongche_shi
  • yongche_shi
  • 2016年05月25日 18:21
  • 2971

Redis的内存优化与对持久化机制的分析

通过对Redis支持的数据类型实现上的分析可以看出redis实际上的内存管理成本非常高,即占用了过多的内存,作者对这点也非常清楚,所以提供了一系列的参数和手段来控制和节省内存,我们分别来讨论下。 ...
  • u012538947
  • u012538947
  • 2015年04月06日 23:17
  • 1212
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:.NET 的对象关系持久化机制(1)
举报原因:
原因补充:

(最多只允许输入30个字)