Проблем/практики при меко изтриване на мобилни услуги на Azure

При включено меко изтриване добавям единичен запис на клиента, натискам, изтривам добавения натискане на запис и след това се опитвам да добавя нов запис (и след това натискам) със същия първичен ключ като първоначалния запис, получавам изключение. Изглежда, че EntityDomainManager просто се опитва да направи ново вмъкване, без да проверява дали записът трябва да бъде „актуализиран“, вместо да бъде вмъкнат.

Ако обаче изключа мекото изтриване в конструктора на мениджъра на домейни, всичко работи добре.

Използваме постепенно синхронизиране, така че мекото изтриване, доколкото разбирам, е необходимо, за да работи това, така че да не се окажем с различни картини на това, което е правилно между мобилно устройство и сървър.

Кога е/са препоръчителният подход? Персонализиран EntityDomainManager (или друг DomainManager)? Ако е така, би било полезно за повече яснота относно взаимодействията между контролера на таблицата и мениджъра на домейна.

Създадох този персонализиран мениджър на домейни, който изглежда работи, но бих оценил всякакви насоки/предложения.

public class CustomEntityDomainManager<TData> : EntityDomainManager<TData> where TData : class, ITableData
{

    public CustomEntityDomainManager(DbContext context, HttpRequestMessage request, ApiServices services)
        : base(context, request, services)
    {
    }

    public CustomEntityDomainManager(DbContext context, HttpRequestMessage request, ApiServices services, bool enableSoftDelete) : base(context, request, services, enableSoftDelete)
    {
    }

    public async override Task<TData> InsertAsync(TData data)
    {
        if (data == null)
        {
            throw new ArgumentNullException("data");
        }

        // now then, if we have soft delete enabled & data has been provided with an id in it 
        if (EnableSoftDelete && data.Id != null)
        {
            // now look to see if the record exists and if it is deleted
    // if so we look to remove the record before then attempting the insert

            // record old value of deleted, since need to query to see if deleted.
            var oldIncludeDeleted = IncludeDeleted;

            try
            {
                IncludeDeleted = true;
                var existingData = await this.Lookup(data.Id).Queryable.FirstOrDefaultAsync();

                // if record exists, and its soft deleted then truly delete it
                if (existingData != null && existingData.Deleted)
                {
                    // now need to remove this record...
                    this.Context.Set<TData>().Remove(existingData);
                }
            }
            finally
            {
                IncludeDeleted = oldIncludeDeleted;        
            }
        }

        if (data.Id == null)
        {
            data.Id = Guid.NewGuid().ToString("N");
        }

        return await base.InsertAsync(data);
    }

person jamie    schedule 13.11.2014    source източник


Отговори (1)


Това поведение е проектирано - ние изискваме да направите изрично възстановяване на изтриването, преди да извършите актуализацията.

Решението, което представихте, е добро. Можете също така да преместите кода във вашия контролер за таблица, ако приемем, че имате нужда от това поведение само в една таблица. Ако имате нужда от него в множество таблици, тогава персонализираният мениджър на домейн е най-добрият подход.

person lindydonna    schedule 17.11.2014