Я импортирую данные между двумя разными базами данных (, которые имеют разный контекст ).
Итак, у меня два разных контекста. Цель состоит в том, чтобы импортировать некоторые данные из контекста A в контекст B.
Данные в контексте B никогда не редактируются напрямую, они только импортируются из контекста A. В контексте B я копирую идентификатор, из которого он был импортирован.
Теперь я пытаюсь получить список всех данных, которые не находятся в контексте B или имеют более позднюю версию.
У меня есть поле ModifiedAt" в таблице two, позволяющее узнать, было ли поле изменено.
Вот мой текущий код:
//Here I get all my current data in the context B with their modification time
Dictionary<int,DateTime> currentItems = contextB.Dossiers.ToDictionary(d=>d.MatchingReferenceId, d=>d.ModifiedAt);
//And here the pain starts:
contextA.Dossiers.Where(da=> !currentItems.Keys.Contains(da.Id) || currentItems.FirstOrDefault(db=>db.Key == da.Id).Value <da.ModifiedAt)//And I'm looping on it with a foreach.
Первая часть (, где я проверяю, есть ли в контексте B элемент или нет ), работает, со второй частью я получил это исключение:
Unable to process the type 'System.Collections.Generic.KeyValuePair`2[]', because it has no known mapping to the value layer.
Но я не могу сделать проще, чтобы иметь эту связь между идентификатором и временем модификации (в начале, у меня был класс POCO из другого контекста, я также пробовал с анонимным типом, тот же результат)
Что мне не хватает?
Редактировать 1
Я также пробовал это с точно таким же результатом :contextA.Dossiers.Where (da=> !currentItems.Keys.Contains (da.Id )|| currentItems.Any (db=>db.Key == da.Id && db.Value
Редактировать 2
Я попробовал лямбду, но здесь она не любит играть с двумя контекстами одновременно:
var myList = (from db in contextB.Dossiers
let dstId = newContext.Dossiers.Select(d=>d.MatchingReferenceId)
from da in contextA.Dossiers
where !db.Contains(dSource.ID)|| (db.MatchingReferenceId == da.Id && db.ModifiedAt< da.ModifiedAt)
select new {NewId =db.Id, OldId = da.Id});
-->
The specified LINQ expression contains references to queries that are associated with different contexts.