W aplikacji n-warstwowej linq-sql nie wydaje się mieć jednoznacznego rozwiązania do aktualizacji odłączonego obiektu, który ma podrzędne jednostki EntitySets.Aktualizowanie odłączonego elementu zawierającego elementy podrzędne w linq do sql
Mam LINQ-SQL podmioty ...
public partial class Location : INotifyPropertyChanging, INotifyPropertyChanged
{
public int id;
public System.Nullable<int> idLocation;
public string brandingName;
public System.Data.Linq.Binary timeStamp;
public EntitySet<LocationZipCode> LocationZipCodes;
}
public partial class LocationZipCode : INotifyPropertyChanging, INotifyPropertyChanged
{
public string zipcode;
public string state;
public int idLocationDetail;
public int id;
public System.Data.Linq.Binary timeStamp;
public EntityRef<Location> Location;
}
Więc podmiot Location
miałoby EntitySet
z LocationZipCodes
.
Model domeny modelu Location
zostaje zmapowany do modelu widoku, który warstwa prezentacji pochłania, a następnie ostatecznie odsyła zmieniony model widoku widoku, w którym jest mapowany z powrotem do modelu domeny Location
. Stamtąd aktualizuję encję i zapisuję zmiany. Oto obsługi:
public class ProgramZipCodeManagerHandler : IHttpHandler {
private LocationsZipCodeUnitOfWork _locationsZipCodeUnitOfWork = new LocationsZipCodeUnitOfWork();
public void ProcessRequest(HttpContext context) {
if (context.Request.HttpMethod == "POST") {
string json = Json.getFromInputStream(context.Request.InputStream);
if (!string.IsNullOrEmpty(json)) {
Location newLocation = Json.deserialize<Location>(json);
if (newLocation != null) {
//this maps the location view model from the client to the location domain model
var newDomainLocation = new Mapper<Location, DomainLocation>(new DomainLocationMapTemplate()).map(newLocation);
if (newDomainLocation.id == 0)
_locationsZipCodeUnitOfWork.locationRepository.insert(newDomainLocation);
else
_locationsZipCodeUnitOfWork.locationRepository.update(newDomainLocation);
_locationsZipCodeUnitOfWork.saveChanges(ConflictMode.ContinueOnConflict);
var viewModel = new Mapper<DomainLocation, Location>(new LocationMapTemplate()).map(newDomainLocation);
context.Response.ContentType = "application/json";
context.Response.Write(Json.serialize(viewModel);
}
}
}
}
}
Oto sposób zmiana w moim locationRepository
:
protected System.Data.Linq.Table<T> _table;
public void update(T entity) {
_table.Attach(entity, true);
_context.Refresh(RefreshMode.KeepCurrentValues, entity);
}
public void update(T newEntity, T oldEntity) {
_table.Attach(newEntity, oldEntity);
_context.Refresh(RefreshMode.KeepCurrentValues, newEntity);
}
widzę, że wszystkie zapisy związane bezpośrednio z jednostką Location
są zaktualizowane, ale kolekcji dziecięcej (public EntitySet<LocationZipCode> LocationZipCodes
) jest nie aktualizowane.
Czy istnieje wyraźny sposób aktualizowania odłączonego obiektu, który ma podrzędny zestaw jednostek EntitySet, który również wymaga aktualizacji? Innymi słowy, mam odłączony podmiot, który ma kolekcję innego podmiotu. Ta kolekcja uległa zmianie i muszę ją zaktualizować w bazie danych.
Czy wpisy w kolekcji dziecka mają odpowiednie identyfikatory? – rhughes
Tak, mają swój identyfikator – bflemi3