Исходя из вашего отредактированного вопроса, я хотел бы сесть и спросить себя, действительно ли мне ДЕЙСТВИТЕЛЬНО нужно генерировать эти классы динамически во время выполнения ? Похоже, это суть вашего вопроса, но я должен подумать, что сценарий использования будет относительно небольшим.
Кажется более вероятным, что вы просто хотите создать классы сущностей, которые отражают то, что находится в вашей базе данных. Для этого вы можете посмотреть на 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;
}
}
}