Microsoft.OData.Client.DataServiceCollection.Load завершается с ошибкой «Объект уже отслежен», поскольку загруженный объект несколько раз содержит вложенные виртуальные объекты - PullRequest
0 голосов
/ 09 ноября 2018

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, не загружая все вложенные / навигационные / виртуальные ..

Любая помощь очень ценится, это сводит меня с ума -.-

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...