Есть ли способ разрешить Breeze обновлять определенные свойства сложного типа на сервере при обновлении записи? - PullRequest
0 голосов
/ 23 апреля 2019

Я бы прочитал в документации, что при обновлении сущности, если вы изменили одно из его свойств на сервере, и это свойство не было изменено на клиенте, вам также следует добавить имя свойства в EntityInfo.OriginalValuesMap толковый словарь. Кроме того, вы можете принудительно обновить каждое поле, установив EntityInfo.ForceUpdate = True;

Один из приведенных примеров предназначен для информации аудита:

public bool BeforeSaveEntity(EntityInfo info)
{
    if (info.EntityState == EntityState.Modified && 
        info.Entity is IAuditable)
    {
        var auditable = (IAuditable) info.Entity;
        auditable.Modified = DateTime.UtcNow;
        auditable.UserId   = CurrentUser.Id;

        // Add property to map so that ContextProvider updates db
        // original values don't matter
        info.OriginalValuesMap["Modified"] = null;
        info.OriginalValuesMap["UserId"] = null;
    }
    // ... more stuff
}

Проблема, с которой я столкнулся, заключается в том, что мой AuditInfo является сложным типом, который содержит 4 свойства: CreatedDate, CreatedBy, ModifiedDate и ModifiedBy.

Таким образом, приведенный выше пример становится:

public bool BeforeSaveEntity(EntityInfo info)
{
    if (info.EntityState == EntityState.Modified && 
        info.Entity is IAuditable)
    {
        var auditable = (IAuditable) info.Entity;
        auditable.AuditInfo.ModifiedDate = DateTime.UtcNow;
        auditable.AuditInfo.ModifiedBy = CurrentUser.Id;

        // Add property to map so that ContextProvider updates db
        // original values don't matter
        info.OriginalValuesMap["AuditInfo"] = null;
    }
      // ... more stuff
}

Я также никогда не отправляю этот AuditInfo клиенту (используя атрибут JsonIgnore для свойства в модели)

Таким образом, проблема с приведенным выше кодом состоит в том, что он также делает другие 2 свойства AuditInfo доступными для редактирования (т.е. CreatedDate и CreatedBy), и, поскольку я никогда не отправляю их клиенту, они будут отключены, когда я изменю запись обратно на сервер.

Я также попытался установить значение словаря для «AuditInfo» для объекта JObject, содержащего только 2 поля, которые я хотел обновить (например, {ModifiedDate: null, ModifiedBy: null}), но, похоже, это не работает. Кажется, что это не позволяет быть настолько гранулированным при указании, какие конкретные свойства сложного типа вы хотите обновить на сервере.

Так что мой вопрос ... есть ли способ достичь желаемого поведения без изменения AuditInfo, чтобы он не был сложным типом?

Это не должно быть проблемой, но мне было просто интересно, есть ли простой способ достичь того, чего я хотел, без необходимости, это все.

Спасибо

...