Microsoft.OData.Client:
У меня есть серьезная проблема с DataServiceCollection, которую мне нужно иметь, чтобы SaveChanged с PostOnlySetProperties
DataServiceCollection.Load вызывает исключение "Контекстуже отслеживает другой объект с тем же ресурсом Uri. "
Но мой Default.Container / Context не отслеживается по умолчанию (mergeoption = notracking), поэтому конфликтующие сущности - это в основном те же сущности, являющиеся вложенными виртуальными объектами одного объекта, который я пытаюсь загрузить с помощью DataServiceCollection.
Меня не интересует изменение вложенных / виртуальных / навигационных свойств вообще, поэтому я ищу способ загрузить свой объект в DataServiceCollection без присоединения всех вложенных / виртуальных / навигационных свойств
упрощенная МОДЕЛЬ: (моя модель довольно большая, древовидная, строго 1: n)
[global::Microsoft.OData.Client.Key("AR_NR")]
[global::Microsoft.OData.Client.OriginalNameAttribute("AR")]
[Microsoft.OData.Client.EntitySet("AR")]
public partial class AR : global::Microsoft.OData.Client.BaseEntityType, iCRUD, INotifyPropertyChanged, IDataErrorInfo
public AR()
{
this.ARVAs = new DataServiceCollection<ARVA>(null, global::Microsoft.OData.Client.TrackingMode.None);
}
partial void OnAR_NRChanging(string value);
partial void OnAR_NRChanged();
[global::Microsoft.OData.Client.OriginalNameAttribute("AR_NR")]
public string AR_NR
{
get { return this._ar.ar_nr; }
set
{
this.OnAR_NRChanging(value);
this._ar.ar_nr = value;
this.OnAR_NRChanged();
ValidateProperty("AR_NR");
this.OnPropertyChanged("AR_NR");
}
}
[IgnoreClientProperty]
public DataServiceCollection<ARVA> ARVAs { get; set; }
КОНТЕКСТ:
DataServiceCollection<AR> changeTracker = null;
public void StartChangeTracking(Default.Container context)
{
try
{
changeTracker = new DataServiceCollection<AR>(context, "AR", null, null);
changeTracker.Load(this);
}
catch(Exception ex)
{
// this will except a lot, especially if loaded object contains multiple same objects (e.g. 2 ARVA can contain the same ARVAZU)
}
}
public void EndChangeTracking(Default.Container context)
{
try
{
foreach (var entry in context.EntityTracker.Entities)
context.Detach(entry.Entity);
//context.Detach(this);
changeTracker = null;
}
catch (Exception ex)
{
}
}
public bool Update(Default.Container context)
{
bool retVal = false;
try
{
// Update
context.SaveChanges(Microsoft.OData.Client.SaveChangesOptions.PostOnlySetProperties);
retVal = true;
}
catch (Exception ex)
{
retVal = false;
}
return retVal;
}
Итак, как вы можете видеть, после запуска отслеживания изменений я вызываю новую DataServiceCollection,попробуйте добавить мой объект - получите исключение, потому что вложенная виртуальная коллекция 'ARVA' может иметь одну и ту же сущность несколько раз.
Кроме того, DataServiceCollection фактически прикрепила 62 сущности вместо моего базового объекта - я НЕ заинтересован в присоединениивсе вложенные / навигационные / виртуальные свойства, но я не могу найтиспособ загрузить мой объект в DSC, не загружая все вложенные / навигационные / виртуальные ..
Любая помощь очень ценится, это сводит меня с ума -.-