2013-10-07 6 views
2

im работает с breezejs, а серверный код моего приложения - .net.Проблемы с breezejs с пакетом сохранения

в моих представлениях (на стороне клиента), я хочу добавить и сущность, то я хочу ее сохранить. Давайте предположим, что объект, как это:

{ 
    "Id": 1, 
    "Name": "someName", 
    "CreatedDate": "1900-01-01T05:00:00Z", 
    "UpdatedDate": "1900-01-01T05:00:00Z", 
    "CreatedBy": null, 
    "UpdatedBy": null, 
    "RowVersion": 0, 
    etc ... 
    } 
} 

я хочу, чтобы установить значения CreatedDateUpdatedDateCreatedBy и UpdatedBy, я могу сделать это с помощью JavaScript, конечно, но я не хочу, чтобы клиент заботиться о тех рода вещей.

мой контроллер ветер, где живет эта функция выглядит так:

[HttpPost] 
public SaveResult SaveChanges(JObject saveBundle) 
{ 
    return _contextProvider.SaveChanges(saveBundle); 
} 

, как и можно видеть saveBundle является JObject, когда я отладки я вижу saveBundle так:

{ 
"entities": [ 
{ 
    "Id": 1, 
    "Name": "someName", 
    "CreatedDate": "1900-01-01T05:00:00Z", 
    "UpdatedDate": "1900-01-01T05:00:00Z", 
    "CreatedBy": null, 
    "UpdatedBy": null, 
    "RowVersion": 0, 
    etc ... 
    } 
    } 
} 
], 
"saveOptions": {} 
} 

Как могу ли я изменить значения CreatedDateUpdatedDateCreatedBy и UpdatedBy в saveBundle перед сохранением? ???

это JObject с массивом объектов как proprety, я могу манипулировать Json с помощью javascript, как я могу это сделать с .Net ???

Большое спасибо.

ответ

5

Благодаря сообщению Jay Traband я, наконец, нашел способ внести изменения в объект перед его сохранением.

Я перегрузил BeforeSaveEntity так:

protected override bool BeforeSaveEntity(EntityInfo entityInfo) { 
     // Return false if don´t want to save the entity 
     var entityType = entityInfo.Entity.GetType(); 

     if (entityInfo.Entity.GetType() == typeof(MyEntityTypeModel)) 
     { 
      if (entityInfo.EntityState == EntityState.Added) 
      // It can be 'Modified' or 'Deleted' 
      { 
       var MyModel = entityInfo.Entity as MyEntityTypeModel; 

       MyModel.CreatedDate = DateTime.Now; 
       MyModel.UpdatedDate = DateTime.Now; 
       string username = Membership.GetUser().UserName; 
       MyModel.CreatedBy = username; 
       MyModel.UpdatedBy = username; 
      } 
     } 
     return true; 
    } 

Спасибо большое, и я надеюсь, что это поможет кому-нибудь.

+0

Вы должны отметить это как ответ, верно? –

+0

Я бегала с той же проблемой, и везде я вижу ответ «BeforeSaveEntities». Я сомневаюсь, что это представляет проблему уровня проекта, потому что мы вынуждены делать все манипуляции на уровне бизнеса внутри DataContextProvider, что в идеале должно быть сделано внутри репозитория. Что делать, если у нас есть 10 таких объектов для изменения до сохранения? Будем ли мы использовать swich-case для проверки типа сущности и внесения изменений? Какова наилучшая практика, которой мы можем следовать? – devC

+0

Обратите внимание, что вам также необходимо обновить OriginalValuesMap при изменении Entity, например. entityInfo.OriginalValuesMap ["UpdDate"] = null; Подробнее здесь -> http://breeze.github.io/doc-net/contextprovider.html#OriginalValuesMap – JSancho

3

Вы можете перехватить сторону сервера Breeze Сохранима процесса, используя ContextProvider в виртуального BeforeSaveEntity и BeforeSaveEntities методы. В документации here и here есть дополнительная информация по этой теме.

Например, вы можете переопределить BeforeSaveEntities с кодом что-то вроде следующего.

protected override Dictionary<Type, List<EntityInfo>> BeforeSaveEntities(Dictionary<Type, List<EntityInfo>> saveMap) { 

    foreach (var type in saveMap.Keys) { 
    var list = saveMap[type]; 
     foreach (var entityInfo in list) { 
     var entity = entityInfo.Entity; 
     // .. do something interesting here 
     } 
} 
+0

Да, согласен, но как я могу проверить объект EntityInfo? – dafriskymonkey

+0

Я добавил пример к предыдущему ответу. –

+0

Спасибо, спасли мою ночь –

Смежные вопросы