Witam,
Mam taki problem:
Posiadam gotową bazę danych z tabelami oraz relacjami miedzy nimi
Posiadam tez aplikacje która ma swoje klasy w modelu z odpowiednimi atrybutami do walidacji odpowiadającej każdej tabeli w bazie
Teraz mój problem polega na tym jak zmapować gotowe tabele w bazie danych na gotowe klasy uwzględniając przy tym tez relacje?
Czy powinienem użyć techniki code-first?
Mój projekt wygląda następująco:
SubjectModel.cs
public class SubjectModel
{
[HiddenInput(DisplayValue=false)]
public int Subject_Id { get; set; }
[Required]
[Display(Name = "Nazwa")]
[StringLength(30)]
public string Name { get; set; }
[Required]
[Display(Name = "Skrót")]
[StringLength(10)]
public string ShortName { get; set; }
[Display(Name = "Czy przedmiot ma prowadzić opiekun grupy?")]
public bool GroupLeader { get; set; }
}
SubjectLINQ_To_EF.cs
public class SubjectsLINQ_To_EF : ISubjects
{
private Entities context;
private int UserId;
public SubjectsLINQ_To_EF()
{
this.context = new Entities();
this.UserId = WebSecurity.CurrentUserId;
}
public List<SubjectModel> GetSubjects(int TypeSchool)
{
var guery = (from o in context.Subjects
where o.UserId == UserId && o.TypeSchool == TypeSchool
select new SubjectModel
{
Subject_Id = o.Subject_Id,
Name = o.Name,
ShortName = o.ShortName,
GroupLeader = o.GroupLeader
}).ToList();
return guery;
}
public SubjectModel GetSubjectById(int Subject_Id)
{
try
{
var guery = (from o in context.Subjects
where o.Subject_Id == Subject_Id
select new SubjectModel
{
Subject_Id = o.Subject_Id,
Name = o.Name,
ShortName = o.ShortName,
GroupLeader = o.GroupLeader
}).Single();
return guery;
}
catch
{
return null;
}
}
public void AddSubject(int TypeSchool, SubjectModel obj)
{
Subjects o = new Subjects
{
UserId = UserId,
TypeSchool = TypeSchool,
Name = obj.Name,
ShortName = obj.ShortName,
GroupLeader = obj.GroupLeader
};
context.Subjects.InsertOnSubmit(o);
context.SubmitChanges();
}
public void EditSubject(SubjectModel obj)
{
var o = context.Subjects.Find(obj.Subject_Id);
if (o != null)
{
o.Name = obj.Name;
o.ShortName = obj.ShortName;
o.GroupLeader = obj.GroupLeader;
context.SubmitChanges();
}
}
public void DeleteSubject(int Subject_Id)
{
var obj = context.Subjects.Find(Subject_Id);
if (obj != null)
{
context.Subjects.DeleteOnSubmit(o);
context.SubmitChanges();
}
}
}
Dodam ze aplikacja posiada element Entity Data Model do którego odwołuje się w celu uzyskania informacji z bazy.
Czy odpowiednio zabrałem się za stworzenie tego połączenia?
Co zrobić gdy analogicznie stworze klasę Teacher i ona jest powiązana relacja z tabela Subject więc chciałbym aby tabela teacher zawierała listę Subjects?
Chodzi mi o to czy dobrze robię pobierając dane z bazy do wyświetlenia za każdym razem tworze klasę Subject?
Zauważyłem ze Entity Data Model tworzy własny DbContext zawierający właśnie te tabele i wygenerowane już klasy z tymi polami no ale korzystając z tych klas to co wtedy gdy będę potrzebował atrybutów we walidacji? Dzięki temu w klasie SubjectLINQ_To_EF.cs zamiast SubjectModel mógłbym zwracać klasę wygenerowana w Entity Data Model która już posiada powiązane ze sobą relacje lecz własnie boli mnie ten problem walidacji gdy będę chciał np dodać nowy element do bazy który kontrolują atrybuty postawione przy polach w klasie, czy powinienem korzystać przy zczytywaniu z bazy to EDM a przy dodawaniu i edycji to za pomocą klasy SubjectModel i ręcznie mapować tak jak jest w klasie SubjectLINQ_To_EF.cs?
Oczywiście chce oddzielić w ten sposób kontrolery od działania bazy danych wykonując zapytania w tej drugiej klasie.
Na temat EF w internecie jest wiele metod jednak ciężko mi do poukładać w jedną całość pasująca odpowiednio do mojej aplikacji, może ja za bardzo kombinuje jednak potrzebuje pomocnej ręki która poukłada moje teorie w jedna całość.