我试着用一个例子来解释我需要什么
我在数据库中有一个 Patient 和 Order 表。患者可以通过存储过程获得多个订单,我将获取与该患者相关的患者属性和订单,并将其放入数据集中。但是患者属性将在一个数据表中,而该患者的顺序将在另一个数据表中。在前端我需要创建一个这个关系的类。
像 Class Patient {他已完成的订单的患者属性列表}
我试着用一个例子来解释我需要什么
我在数据库中有一个 Patient 和 Order 表。患者可以通过存储过程获得多个订单,我将获取与该患者相关的患者属性和订单,并将其放入数据集中。但是患者属性将在一个数据表中,而该患者的顺序将在另一个数据表中。在前端我需要创建一个这个关系的类。
像 Class Patient {他已完成的订单的患者属性列表}
假设您正在谈论 .NET Framework 中的 System.Data.DataRelation 类...
MSDN 提供了有关此类属性的大量信息,包括您需要的属性。
http://msdn.microsoft.com/en-us/library/system.data.datarelation.aspx
using System.Data;
var myRelation = new DataRelation(...your data...);
DataTable parent = myRelation.ParentTable;
DataTable child = myRelation.ChildTable;
ForeignKeyConstraint foreignKey = myRelation.ChildKeyConstraint;
UniqueConstraint uniqueKey = myRelation.ParentKeyConstraint;
DataColumn[] childColumns = myRelation.ChildColumns;
DataColumn[] parentColumns = myRelation.ParentColumns;
ETC...
也就是说,我建议您详细说明您想要做什么。从您的陈述中不清楚“所以我需要创建一个关系并且必须从数据集创建一个类。如果不可能,有没有其他方法可以做到这一点?” 你的用例是什么。这使得很难回答您想要解决的核心问题。
根据您编辑的问题,我会坐下来问自己,我真的需要在运行时动态生成这些类吗?这似乎是您问题的重点,但我应该认为用例会相对较小。
您似乎更有可能只想创建反映数据库中内容的实体类。为此,您可能会查看像 Nhibernate(和许多其他)这样的 ORM,或者您甚至可以推出自己的 ORM。甚至强类型的数据集也是一种选择。
如果您正在做更多一次性的事情,LINQ to SQL 查询可以根据您的数据返回匿名类 - 完成类型安全等。
最重要的是,我仍然不确定您到底要做什么,或者为什么?问题是“如何将数据从数据库获取到实体类”,还是问题“如何在两个类之间创建‘has-a’关系”,或者......?
那么前者。我将首先重申类之间存在关系,表之间存在关系。没有理由你的类必须知道表中的关系,只是它们之间的关系
也就是说,像 Nhibernate 这样的 ORM 将帮助您维护表之间的关系。
在将数据从数据库中取出并放入您的实体方面,下面是一种简单的方法。我不会说这是理想的,甚至是好的,但核心思想是有效的。我建议您熟悉基本操作,然后阅读更多内容(并提出更多问题)以了解适用于您的应用程序的好方法。
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
namespace Sample
{
public class Patient
{
public int PatientId { get; set; }
public string Name { get; set; }
private IEnumerable<Order> _orders;
public List<Order> Orders { get { return new List<Order>(_orders); } }
public static Patient GetById(int patientId)
{
using (var cn = new SqlConnection("your Patient connection string"))
{
cn.Open();
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.Text;
cm.CommandText = "SELECT PatientId, Name FROM Patient WHERE PatientId = @PatientId";
cm.Parameters.AddWithValue("@PatientId", patientId);
using (SqlDataReader dr = cm.ExecuteReader())
{
if (!dr.Read())
return null;
return new Patient
{
PatientId = dr.GetInt32(0),
Name = dr.GetString(1),
_orders = Order.GetAllForPatient(patientId)
};
}
}
}
}
public bool Save()
{
// save Patient to Database
foreach (var order in _orders)
order.Save();
return true;
}
}
public class Order
{
public int OrderId { get; set; }
public int PatientId { get; set; }
public string ServiceOrdered { get; set; }
public static IEnumerable<Order> GetAllForPatient(int patientId)
{
var orders = new List<Order>();
using (var cn = new SqlConnection("your Order connection string"))
{
// ... load Orders Here.
}
return orders;
}
public bool Save()
{
//save order to database;
return true;
}
}
}