2016-02-04 1 views
0

У меня есть поставщик контентов Breeze, говорящий с EF 6.1.1, приложение с базами данных с SQL Server, с которыми у меня возникают проблемы. Я могу ВСТАВИТЬ новую запись, но когда я ее обновляю, не все измененные столбцы записываются в базу данных.Breeze-> EF6, обновляющий некоторые измененные столбцы, но не все

У меня есть сгенерированный ПОКО, который выглядит следующим образом:

public partial class Inventory 
{ 
    public Inventory() 
    { 
    } 

    public int Id { get; set; } 
    public System.DateTime EnteredAt { get; set; } 
    public string EnteredBy { get; set; } 
    public string UpdatedBy { get; set; } 
    public Nullable<System.DateTime> UpdatedAt { get; set; } 
    public string Comment { get; set; } 
} 

Когда я иду и обновить объект на стороне клиента (установка Комментарий недвижимости) и отправить его в Бриз, я несколько очень простых множеств в EFContextProvider :: BeforeSaveEntity переопределение:

protected override Dictionary<Type, List<EntityInfo>> BeforeSaveEntities(Dictionary<Type, List<EntityInfo>> saveMap) 
    { 
     // only one inventory is ever sent in 
     if (saveMap.ContainsKey(typeof(Inventory))) 
     { 
      var source = saveMap[typeof(Inventory)].First().Entity as Inventory; 

      // set up the user and time fields 
      if (source.Id <= 0) 
      { 
       source.EnteredBy = _defaultUserName; 
       source.EnteredAt = DateTime.Now; 
      } 
      else 
      { 
       source.UpdatedBy = _defaultUserName; 
       source.UpdatedAt = DateTime.Now; 
      } 

     } 
    } 

Но когда изменение получает совершено, измененное значение UpdatedBy никогда не попадает в базу данных.

Я включил ведение журнала EF6 SQL и, конечно, оператор UPDATE полностью пропускает свойство.

UPDATE [dbo].[Inventory] 
SET [Comment] = @0, [UpdatedAt] = @1 
WHERE ([Id] = @2) 
-- @0: '1532' (Type = AnsiString, Size = 250) 
-- @1: '2/4/2016 10:32:58 PM' (Type = DateTime2) 
-- @2: '100344' (Type = Int32) 
-- Executing at 2/4/2016 3:33:06 PM -07:00 
-- Completed in 7 ms with result: 1 

Конечно, UpdateBy является NULL в базе данных для этого обновления.

Я не могу понять, почему этот конкретный столбец не пройдет, когда столбец «соседний», установленный в одно и то же время, делает это. Я также не знаю, является ли это проблемой Breeze или проблемой EF, так как я могу вернуться и просто использовать EF, DBContext работает нормально.

Я также попытался удалить таблицу из файла EDMX и повторно добавить ее безрезультатно. Я повторно проверил, что столбец находится в таблице в файле EDMX.

Как взломать, мне нужно вернуться, перечитать измененную запись напрямую, обновить ее, а затем отправить обратно.

Любые советы будут оценены.

+0

Можете ли вы просто обновить столбец «UpdateBy» (комментировать другой столбец) и сообщить нам, что такое текущее состояние вашей сущности и что происходит, когда вы пытаетесь его сохранить? "var state = ctx.Entry (source) .State;" –

ответ

1

Можете ли вы опубликовать метод BeforeSaveEntity и образец манипуляции с сущностью на стороне клиента в ваш вопрос?

Во-вторых, убедитесь, что вы обновляете propertyMap за информацию объекта в методе BeforeSave следующим образом:

source.UpdatedBy = "Joe User"; 
source.UpdatedAt = DateTime.Now; 
source.Comment = "1532"; 

entityInfo.OriginalValuesMap["UpdatedBy"] = null; 
entityInfo.OriginalValuesMap["UpdatedAt"] = null; 
entityInfo.OriginalValuesMap["Comment"] = null; 

Я интересно, если свойство «UpdatedAt» манипулируют на клиенте перед вызовом SaveChanges , и поэтому это свойство уже было бы идентифицировано как «Изменено» в карте свойств.

+0

Настройка оригинальной картыValuesMap! Благодарю. – cardinalPilot

+0

Отлично! Можете ли вы отметить это как правильный ответ? – Jonathan

0

см. Этот вопрос вы получите ответ.

how to secure add or delete entities with breezejs

Два варианта здесь:
1. Изменение фактического saveMap лицо не в новой организации.
2. Создайте новую сущность как «источник» и замените ее фактическим объектом.

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