Wałkuje od pewnego czasu WCF, a teraz zaczynam pisać aplikację opartą o SOA i nie mogę dojść jak to jest z atrybutem [DataContract] - jak tego używać.
Załóżmy że mam rozdzielony projekt na różne komponenty. Na przykład stworzyłem sobie bibliotekę klas powiedzmy MyApp.Contracts w której mam między innymi DataContract.Mam też bibliotekę klas z Encjami na podstawie których EF utworzy sobie bazę danych. Powiedzmy że mam encję Person
oraz encję Car
. Te dwie encje połączone są ze sobą relacją jeden do wielu.
public class Person
{
public int PersonId {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
public virtual ICollection<Car> Cars {get; set;}
}
Mój Data Contract
public class PersonData
{
public int PersonId {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
public virtual ICollection<CarData> Cars {get; set;} //czy ta linijka jest poprawna ? chodzi mi o to CarData ?
}
To jest mój serwis
public class DataService : IDataService
{
PersonRepository repository = new PersonRepository();
public IEnumerable<PersonData> GetAll()
{
IEnumerable<Person> result = repository.GetAll();
//TUTAJ MAPUJE ENCJE PERSON NA PERSONDATA (DataContract)
IList<PersonData> resultData = new List<PersonData>();
foreach (var p in result)
{
resultData .Add(new PersonData { FirstName = p.FirstName, LastName = p.LastName, Cars = p.Cars });
};
return resultData;
}
}
Kontroler w aplikacji Klienta -ASP.NET MVC
public ActionResult DisplayAll()
{
IEnumerable<PersonData> list= proxy.GetAll();
List<DisplayAllViewModel> viewModel = new List<DisplayAllViewModel>();
foreach(var x in list)
{
viewModel.Add(new DisplayAllViewModel { FirstName = x.FirstName, LastName = x.LastName });
}
return View(viewModel);
}
Czego tu nie rozumiem? Czy mam oznaczyć sobie moje Encje, czyli klasę Person i Car jako [DataContract] i [DataMember], czy mapować ją w relacji 1:1 na PersonData, a encje pozostawić bez żadnych atrybutów związanych z WCF?
Jeżeli powinienem dać atrybuty [DataContract] i [DataMember] na encje to teraz w repozytorium mam mieć powiedzmy dwie różne metody? np:
public class DataService : IDataService
{
PersonRepository repository = new PersonRepository();
public IEnumerable<PersonData> GetSelected()
{
IEnumerable<Person> result = repository.GetAll();
//TUTAJ MAPUJE ENCJE PERSON NA PERSONDATA (DataContract)
IList<PersonData> resultData = new List<PersonData>();
foreach (var p in result)
{
resultData .Add(new PersonData { FirstName = p.FirstName });
};
return resultData;
}
public IEnumerable<Person> GetAll()
{
IEnumerable<Person> result = repository.GetAll();
return result;
}
}
Proszę o jakieś wytłumaczenie jak postępować z data kontraktami. Dzięki!
select n + 1
. Takie rzeczy załatwia się projekcją na poziomie ORMa.ICriteria.SetProjection
, w EF tworząc lambdę doIQueryable.Select
w locie.