1

必要なものを例を挙げて説明しようとしています

データベースにPatientテーブルとOrderテーブルがあります。患者はストアドプロシージャを介して複数の注文を持つことができます。私はその患者に関連する患者の属性と注文を取得し、それをデータセットに入れます。ただし、患者の属性は1つのデータテーブルにあり、その患者の順序は別のデータテーブルにあります。フロントエンドでは、このリレーションのクラスを作成する必要があります。

クラス患者のように{彼が行った注文の患者属性リスト}

4

2 に答える 2

0

あなたの編集された質問に基づいて、私は座って自問します.これらのクラスを実行時に動的に生成する必要は本当にありますか? それがあなたの質問の主旨のようですが、ユースケースは比較的小さいと思います。

データベースにあるものを反映するエンティティークラスを作成したいだけの可能性が高いようです。これについては、Nhibernate (およびその他の多く) のような ORM を参照するか、独自の ORM を作成することもできます。厳密に型指定された DataSet でさえ、ファッションの後でオプションです。

より 1 回限りのことを行う場合、LINQ to SQL クエリは、データに基づいて匿名クラスを返すことができます。タイプ セーフなどを完備しています。

要するに、あなたが何をしようとしているのか、またはその理由はまだ正確にはわかりません。問題は「データベースからエンティティ クラスにデータを取得する方法」ですか、それとも「2 つのクラス間に「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;
        }
    }
}
于 2011-09-27T09:24:42.257 に答える
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;

等...

とはいえ、やりたいことを正確に詳しく説明することをお勧めします。あなたの声明からは明らかではないので、「関係を作成し、データセットからクラスを作成する必要があります。それができない場合、それを行う別の方法はありますか?」あなたのユースケースは何ですか。そのため、解決したい中心的な問題に答えることは困難です。

于 2011-09-27T08:34:27.170 に答える