Выбор инструментов
В качестве СУБД была выбрана MySQL. Она соответствует всем требованиям, предъявляемым поставленной задачей.
MySQL — свободная система управления базами данных (СУБД). MySQL является собственностью компании Oracle Corporation, получившей её вместе с поглощённой Sun Microsystems, осуществляющей разработку и поддержку приложения. Распространяется под GNU General Public License и под собственной коммерческой лицензией, на выбор.
В качестве языка программирования был выбран С# и среда разработки Microsoft Visual Studio 2010. Так же используются технологии ORM (Object-Relational Mapping). Благодаря ей, мы можем отображать объекты С# на реляционную базу данных. Т.е., например, описать класс и отобразить его на таблицу в MySQL и ORM сама разберется, какие запросы надо отправлять для выборки, сохранения, обновления и удаления с сохранением связей.
В нашем приложении будет 5 вспомогательных классов, которые
Описывают сущности, находящиеся в БД, и ещё 5 классов для отображения связей с таблицами БД.
В качестве ORM технологии был выбран Fluent NHibernate - это надстройка над NHibernate. Fluent NHibernate предоставляет альтернативу стандартным XML-файлам конфигурации меппинга NHibernate. Вместо написания XML документов (.hbm.xml), Fluent NHibernate позволяет нам писать маппинг в строго типизированной форме, на языке C#. Это обеспечивает легкость рефакторинга, улучшает читабельность и лаконичность кода, экономит кучу времени. Позволяет не задумываться о том, как должны выглядеть XML файлы. Контроль типов, автоматическое подключение классов к маппингу, возможность удобной настройки соединения с базой данных и т.д. и т.п.
Для того чтобы мы могли использовать в своем проекте Fluent NHibernate, нам надо добавить ссылки на библиотеки NHibernate.dll, FluentNHibernate.Mapping, FluentNHibernate.Cfg, FluentNHibernate.Cfg.Db.
Остальные библиотеки тоже должны лежать в одном каталоге с приложением.
Чтобы подключить к нашему приложению Fluent NHibernate, достаточно описать конфигурацию подключения:
var config = Fluently.Configure()
.Database(MySQLConfiguration.Standard
.ConnectionString(x => x.Database(DataBase)
.Server(Host)
.Username(User)
.Password(Password)))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<DepartMap>())
.BuildConfiguration();
MySession = config.BuildSessionFactory();
Правила отображения для каждого класса хранятся в отдельном файле. Обычно его называют «имя_сущностиMap.cs»
Departament
Класс:
public class Departament
{
public virtual int Id { get; protected set; }
public virtual string Name { get; set; }
public virtual IList<Personnel> Personnels { get; set; }
public Departament ()
{
Personnels = new List<Personnel>();
}
public virtual void AddPersonnel(Personnel personel)
{
personel.Departament = this;
Personnels.Add(personel);
}
}
Отображение:
public class DepartMap : ClassMap<Departament>
{
public DepartMap()
{
Id(x => x.Id).Not.Nullable();
Map(x => x.Name).Not.Nullable();
HasMany(x => x.Personnels)
.Inverse()
.KeyColumn("Departament_id")
.Cascade.SaveUpdate();
}
}
Diagnosis
Класс:
public class Diagnosis
{
public virtual int Id { get; set; }//idDiagnosis
public virtual string Name { get; set; }
public virtual Departament Departament { get; set; }
public virtual Personnel Personnel { get; set; }
public virtual String Description { get; set; }
public virtual IList<Medication> Medications { get; set; }
public Diagnosis ()
{
Medications = new List<Medication>();
Description = "";
}
//Добавление лекарства к этому диагнозу
public virtual void AddMediacation (Medication med)
{
med.Diagnosis.Add(this);
Medications.Add(med);
}
}
Отображение:
public class DiagnosisMap : ClassMap<Diagnosis>
{
public DiagnosisMap()
{
Table("diagnosis");
Id(x => x.Id).Column("idDiagnosis").Not.Nullable();
Map(x => x.Name).Not.Nullable();
Map(x => x.Description);
HasManyToMany(x => x.Medications)
.Table("diagnosis_has_medications")
.ParentKeyColumn("idDiagnosis")
.ChildKeyColumn("idMedications");
References(x => x.Departament)
.Column("Departament_id")
.Cascade.SaveUpdate();
References(x => x.Personnel)
.Column("Personnel_id")
.Cascade.SaveUpdate();
}
}
Medication
Класс:
public class Medication
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual int Numb_per_day { get; set; }
public virtual int Duration { get; set; }
public virtual decimal Price { get; set; }
public virtual string Description { get; set; }
public virtual IList<Diagnosis> Diagnosis { get; set; }
public Medication()
{
Diagnosis = new List<Diagnosis>();
Description = "";
}
//Добавление диагноза к лекарству
public virtual void AddDiagnosis (Diagnosis diagnosis)
{
Diagnosis.Add(diagnosis);
diagnosis.Medications.Add(this);
}
}
Отображение:
public class MedicationMap : ClassMap<Medication>
{
public MedicationMap()
{
Table("medications");
Id(x => x.Id).Column("idMedications").Not.Nullable();
Map(x => x.Name).Not.Nullable();
Map(x => x.Numb_per_day);
Map(x => x.Duration);
Map(x => x.Price);
Map(x => x.Description);
HasManyToMany(x => x.Diagnosis)
.Table("diagnosis_has_medications")
.ParentKeyColumn("idMedications")
.ChildKeyColumn("idDiagnosis")
.Inverse();
}
}
Pacient
Класс:
public class Pacient
{
public virtual int Id { get; set; }
public virtual string Name{ get; set; }
public virtual string Address{ get; set; }
public virtual DateTime Birthday { get; set; }
public virtual DateTime Data_arrival { get; set; }
public virtual DateTime Data_depart { get; set; }
public virtual Departament Departament { get; set; }
public virtual Diagnosis Diagnosis { get; set;}
public override bool Equals(object obj)
{
if (obj is Pacient)
{
Pacient p = (obj as Pacient);
bool b = true;
if (Name != p.Name) b = false;
if (Address != p.Address) b = false;
if (Birthday != p.Birthday) b = false;
if (Data_arrival != p.Data_arrival) b = false;
if (Data_depart != p.Data_depart) b = false;
if (Diagnosis.Departament != p.Diagnosis.Departament) b = false;
if (Diagnosis.Name != p.Diagnosis.Name) b = false;
if (Diagnosis.Personnel != p.Diagnosis.Personnel) b = false;
if (Diagnosis.Description != p.Diagnosis.Description) b = false;
if (Departament != p.Departament) b = false;
return b;
}
else return false;
}
}
Отображение:
public class PatientMap : ClassMap<Pacient>
{
public PatientMap()
{
Table("pacienty");
Id(x => x.Id).Not.Nullable();
Map(x => x.Name).Not.Nullable();
Map(x => x.Address);
Map(x => x.Birthday);
Map(x => x.Data_arrival);
Map(x => x.Data_depart);
References(x => x.Departament, "Departament_id");
References(x => x.Diagnosis, "Diagnosis_id");
}
}
Personnel
Класс:
public class Personnel
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual string Address { get; set; }
public virtual DateTime Birthday { get; set; }
public virtual string Phone { get; set; }
public virtual string Post { get; set; }
public virtual decimal Salary{ get; set; }
public virtual Departament Departament{ get; set; }
public override bool Equals(object obj)
{
if (obj is Personnel)
{
Personnel p = (obj as Personnel);
bool b = true;
if (Name != p.Name) b = false;
if (Address != p.Address) b = false;
if (Birthday != p.Birthday) b = false;
if (Phone != p.Phone) b = false;
if (Post != p.Post) b = false;
if (Salary != p.Salary) b = false;
if (Departament != p.Departament) b = false;
return b;
}
else return false;
}
}
Отображение:
public class PersonnelMap : ClassMap<Personnel>
{
public PersonnelMap()
{
Table("personnel");
Id(x => x.Id).Column("idPersonnel");
Map(x => x.Name);
Map(x => x.Address);
Map(x => x.Birthday);
Map(x => x.Phone);
Map(x => x.Post);
Map(x => x.Salary);
References(x => x.Departament)
.Column("Departament_id")
.Cascade.SaveUpdate();
}
}
