65.9K
CodeProject 正在变化。 阅读更多。
Home

使用反射进行对象映射

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.11/5 (8投票s)

2005年10月28日

2分钟阅读

viewsIcon

63599

downloadIcon

410

使用 C# 和 SQL Server 通过反射进行对象映射。

引言

作为一个开发者,我一直受困于将我的领域对象映射到持久数据源(或简而言之,数据库)。 在开发过程中,许多事情会根据不断变化的需求而发生变化。 这些更改迫使开发人员修改应用程序的源代码以及数据库模式,这就是我感到沮丧的地方。 在开发过程中,我不希望我的更改对其他开发人员产生很大的影响。 例如,更改表的结构可能需要修改存储过程、嵌入式动态 SQL 和代码。 在一个理想的开发环境中,当我更改表的结构时,一切都应该为我完成。 因此,OMUR 诞生了。

使用反射的对象映射 (OMUR)

OMUR 背后的前提很简单,使用反射和系统表将 C# 对象映射到数据库表。 OMUR 构建在 SQL Server 2000 之上,并使用 C# (.NET 1.1)。 OMUR 存储并将给定的对象映射到数据库表。 为了使 OMUR 正常工作,您的表名必须与您的类名匹配,并且您的列名必须与您的类的属性匹配。 并且您至少需要对所需数据库中的系统表具有 SELECT 权限,OMUR 才能正常工作。 当 OMUR 为给定的域对象构建数据映射时,它将循环遍历该对象的属性,将它们映射到表中的列。 如果您的表中存在您的对象中不存在的列,它将被忽略。

如何使用 OMUR

使用 OMUR 很简单。

首先,创建你的表。 在此示例中,我们将创建两个表,一个用于存储成员,另一个用于存储每个成员的登录时间。

CREATE TABLE dbo.Member
(
 memberId int not null identity(100000, 1),
 memberName varchar(255) not null,
 primary key (memberId)
)
GO

CREATE TABLE dbo.MemberLogin
(
 memberId int not null,
 memberLogin datetime not null,
 memberLoginUtc datetime not null,
 primary key (memberId, memberLogin)
)
GO

接下来,我们需要创建一些将要使用此数据的对象。 请记住,您的类/属性名称必须与表/列名称完全匹配。 此外,您会注意到一些辅助函数,这些函数在填充或保存这两个对象时非常有用,主要是 Get 和 Save 函数。

 public class Member
 {
  #region Properties

  public int memberId
  {
   get { return m_memberId; }
   set { m_memberId = value; }
  }
  private int m_memberId;

  public string memberName
  {
   get { return m_memberName; }
   set { m_memberName = value; }
  }
  private string m_memberName;

  #endregion

  #region Methods

  public void Save()
  {
   OMUR.DataFactory.Save(this);
  }

  public static Member Get(int id)
  {
   return (Member)OMUR.DataFactory.Get(typeof(Member), id);
  }

  public static Member GetByName(string name)
  {
   return (Member)OMUR.DataFactory.Find(typeof(Member), 
                     "memberName = @memberName", name);
  }

  #endregion
 }


 public class MemberLogin
 {
  #region Properties

  public int memberId
  {
   get { return m_memberId; }
   set { m_memberId = value; }
  }
  private int m_memberId;

  public DateTime memberLogin
  {
   get { return m_memberLogin; }
   set { m_memberLogin = value; }
  }
  private DateTime m_memberLogin;

  public DateTime memberLoginUtc
  {
   get { return m_memberLoginUtc; }
   set { m_memberLoginUtc = value; }
  }
  private DateTime m_memberLoginUtc;

  #endregion

  #region Methods

  public void Save()
  {
   OMUR.DataFactory.Save(this);
  }

  public static MemberLogin Get(int id, DateTime dt)
  {
   return (MemberLogin)OMUR.DataFactory.Get(typeof(MemberLogin), id, dt);
  }

  #endregion
 }

最后,我们如何使用此代码

class Program
 {
  [STAThread]
  static void Main(string[] args)
  {
   Member m = new Member();
   m.memberName = "Stu";
   m.Save();

   Console.WriteLine("New Member ID: {0}", m.memberId);

   MemberLogin ml = new MemberLogin();
   ml.memberId = m.memberId;
   ml.memberLogin = DateTime.Today;
   ml.memberLoginUtc = DateTime.UtcNow;
   ml.Save();

   ml = null;

   ml = MemberLogin.Get(m.memberId, DateTime.Today);

   Console.WriteLine("Login Today: {0:yyyy/MM/dd HH:mm}", 
                                         ml.memberLogin);
   Console.WriteLine("Login UTC  : {0:yyyy/MM/dd HH:mm}", 
                                      ml.memberLoginUtc);
  }
 }

输出

New Member ID: 100000

Login Today: 2005/10/28 00:00

Login UTC: 2005/10/28 11:23

结论:OMUR 需要什么,以及 OMUR 不是什么

OMUR 需要一种从连接表中选择列表的可靠方法。 目前我还没有花时间设计或考虑这个问题。 此外,为了使 OMUR 更强大一些,它应该是数据库独立的。 虽然目前,我唯一需要访问的数据库是 MS SQL Server。

OMUR 不是一个强大的企业级对象映射库。 OMUR 旨在用于中小型项目。

© . All rights reserved.