2016-02-10 3 views
-1

У меня есть следующий код:EF6 вставки или обновления для сбора лиц

using (var context = new DataContext()) 
{ 
    var dbHistoryItems = context.Set<HistoryItem>(); 

    var historyItems = history as HistoryItem[] ?? history.ToArray(); 
    var historyItemIds = historyItems.Select(c => c.Id); 

    var existingEntities = dbHistoryItems.Where(h => historyItemIds.Contains(h.Id)); 
    if (existingEntities.Any()) 
    { 
     var newEntities = historyItems.Where(h => !existingEntities.Select(e => e.Id).Contains(h.Id)); 
     dbHistoryItems.AddRange(newEntities); 
    } 
    context.SaveChanges(); 
} 

где history является входной параметр List<HistoryInfo>

Когда объект является новым (объект с идентификатором не существует в контексте) добавить это в контексте. Когда сущность существует - я просто хочу ее сохранить (ее можно изменить).

Проблема в этом коде с обновлением. Он не обновляет существующие объекты.


UPD:

Есть ли лучший способ для вставки или сбора обновлений сущностей затем в цикле, как:

foreach(var item in collection) 
{ 
    db.AddOrUpdate(item); 
} 
db.SaveChanges; 
+0

Вы не изменяете никаких свойств. Откуда берется «история» и какие обновления вы ожидаете? – CodeCaster

+0

И нет, _ "history is input parameter List " _ не уточняет это. Является ли это отдельным объектом, например, с помощью формы POST MVC? – CodeCaster

ответ

1

Кажется, что EF не обнаруживает изменения в элементах массива. Однако вы можете принудительно обновить. Проверьте это Entity Framework 5 Updating a Record

+0

Что означает _ «EF не обнаруживает изменений в элементах массива» _ означает? Кроме того, если вы думаете, что на вопрос ответили в другом месте, отметьте как дубликат, пожалуйста. – CodeCaster

+0

@CodeCaster Для примера sql type 'varbinary' будет' byte [] 'в EF. Изменение некоторых элементов в массиве 'byte []' и вызов 'SaveChanges' не обнаруживают, что содержимое массива было изменено и не будет обновляться. –

+0

Правильно, вам придется повторно назначить свойство aa 'byte []' в сущности или явно пометить его как измененное, чтобы отслеживание изменений могло получить это изменение, но я действительно не вижу, как это связано на этот вопрос. – CodeCaster

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