我试着用一个例子解释我需要什么
我在db中有一个Patient和Order表。患者可以通过存储过程获得多个订单,我将获得与该患者相关的患者属性和订单,并且我将其放入数据集中。但患者属性将在一个数据表中,该患者的顺序将在另一个数据表中。在前端我需要创建一个这个Relation类。
像Class Patient一样 { 患者属性 他所做的订单清单 }答案 0 :(得分:0)
假设您正在讨论.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;
等...
那就是说,我建议详细说明你想要做什么。从你的陈述中不清楚“所以我需要创建一个关系并且必须从数据集创建一个类。如果不可能,有没有其他方法可以做到这一点?”你的用例是什么。这使得很难回答你想要解决的核心问题。
答案 1 :(得分:0)
根据您编辑的问题,我会坐下来问问自己,我真的需要在运行时动态生成这些类吗?这似乎是你问题的主旨,但我认为用例相对较小。
您似乎更有可能只想创建反映数据库中内容的实体类。为此,您可能会看到像Nhibernate(和许多其他人)这样的ORM,或者您甚至可以自己动手。即使是强类型的DataSet也是一种时尚选择。
如果您正在进行更多的一次性操作,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;
}
}
}