我试着用一个例子来说明我需要什么。
我有一个病人和订单表在数据库里。通过存储过程,患者可以有多个订单,我将获得与该患者相关的患者属性和订单,并将其放入数据集中。但是患者属性将位于一个Datatable中,而该患者的Order将位于另一个Datatable中。在前端,我需要创建一个这个关系的类。
like类患者{患者属性他已完成的订单列表}
发布于 2011-09-27 16:34:27
假设您正在谈论.NET框架中的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;等等。
也就是说,我建议详细说明你到底想要做什么。“所以我需要创建一个关系,并且必须从dataset创建一个类。如果不可能,有没有其他方法可以做到这一点?”你的用例是什么。这使得你很难回答你想要解决的核心问题。
发布于 2011-09-27 17:24:42
基于你编辑过的问题,我会坐下来问你自己,我真的需要在运行时动态地生成这些类吗?这似乎是你问题的主旨,但我认为用例相对较小。
似乎更有可能的是,您只想创建反映数据库中内容的实体类。为此,您可能会使用像Nhibernate (和许多其他的)这样的ORM,或者您甚至可以使用自己的ORM。在某种程度上,甚至强类型的DataSets也是一个选择。
如果你正在做一些一次性的事情,LINQ to SQL查询可以根据你的数据返回匿名类-完全的类型安全等。
归根结底,我仍然不确定你到底想要做什么,或者为什么?问题是“如何将数据库中的数据放入实体类”,还是“如何在两个类之间创建‘有-有’关系”,或者...?
那么就是前者了。我首先重申类之间存在关系,表之间也存在关系。您的类没有理由一定要知道表中的关系,只需要知道它们之间的关系
也就是说,像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;
}
}
}https://stackoverflow.com/questions/7566106
复制相似问题