使用反射进行对象映射






4.11/5 (8投票s)
2005年10月28日
2分钟阅读

63599

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 旨在用于中小型项目。