Получить таблицу в DataRelation во время выполнения - PullRequest
1 голос
/ 27 сентября 2011

Я пытаюсь объяснить на примере, что мне нужно

У меня есть таблицы пациентов и заказов в дБ.Через хранимую процедуру пациент может получить несколько заказов. Я получу атрибуты и заказы пациента, связанные с этим пациентом, и внесу его в набор данных.Но атрибуты пациента будут в одном Datatable, а порядок этого пациента будет в другом Datatable.В начале мне нужно создать класс этого отношения.

как Class Patient {список атрибутов пациента, которые он выполнил}

Ответы [ 2 ]

0 голосов
/ 27 сентября 2011

Исходя из вашего отредактированного вопроса, я хотел бы сесть и спросить себя, действительно ли мне ДЕЙСТВИТЕЛЬНО нужно генерировать эти классы динамически во время выполнения ? Похоже, это суть вашего вопроса, но я должен подумать, что сценарий использования будет относительно небольшим.

Кажется более вероятным, что вы просто хотите создать классы сущностей, которые отражают то, что находится в вашей базе данных. Для этого вы можете посмотреть на ORM, как Nhibernate (и многие другие), или вы можете даже свернуть свой собственный. Даже строго типизированные наборы данных являются опцией, после моды.

Если вы делаете что-то более одноразовое, запрос LINQ to SQL может возвращать анонимные классы на основе ваших данных - в комплекте с безопасностью типов и т. Д.

Итог, я все еще не уверен, что именно вы пытаетесь сделать, или почему? Является ли проблема «как мне получить данные из базы данных в класс сущностей», или это проблема «как создать отношение« есть »между двумя классами», или ...?

Итак, первое. Я бы начал с повторения, что между классами существуют отношения, а между таблицами - отношения. Нет причин, по которым ваши классы обязательно должны знать об отношениях в таблицах, просто об отношениях между собой

Тем не менее, ORM, такие как Nhibernate, помогут вам поддерживать связь между таблицами.

С точки зрения получения данных из базы данных и в ваши сущности, простой подход приведен ниже. Я не скажу, что это идеально или даже хорошо, но основные идеи работают. Я бы рекомендовал ознакомиться с основными операциями, а затем прочитать намного больше (и задать намного больше вопросов), чтобы сосредоточиться на хорошем подходе, который работает для вашего приложения.

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;
        }
    }
}
0 голосов
/ 27 сентября 2011

Предполагается, что вы говорите о классе System.Data.DataRelation в .NET Framework ...

В 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;

и т.д ...

Тем не менее, я бы порекомендовал уточнить, что именно вы хотите сделать.Из вашего утверждения не ясно, «поэтому мне нужно создать отношения и создать класс из набора данных. Если это невозможно, есть ли альтернативный способ сделать это?»каков ваш вариант использования.Это затрудняет решение любой основной проблемы, которую вы хотите решить.

...