在运行时在DataRelation中获取表

时间:2011-09-27 08:21:07

标签: datarelation

我试着用一个例子解释我需要什么

我在db中有一个Patient和Order表。患者可以通过存储过程获得多个订单,我将获得与该患者相关的患者属性和订单,并且我将其放入数据集中。但患者属性将在一个数据表中,该患者的顺序将在另一个数据表中。在前端我需要创建一个这个Relation类。

像Class Patient一样 {  患者属性  他所做的订单清单 }

2 个答案:

答案 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;
        }
    }
}