Программа рекурсивно обрабатывает директории и через COM читает специфические свойства определенных файлов. Новые свойства могут определяться пользователем, и быть доступными только у определенного файла. При чтении свойств мне нужно проверять есть ли уже в БД такое свойство и при его отсутствии добавлять, но как избежать запроса к БД для каждого сравнения?
Также не могу разобраться как после сохранения записи в Files и в Property добавить запись в FileProperties?
Заранее премного благодарен за уделенное время и внимание.
foreach(var path in paths){
Files file;
using(var context = new DbContext()){
file = context.FirstOrDefault(f => ... );
}
if(file == null){
file = new Files(){ ... };
using(var context = new DbContext()){
context.Files.Add(file);
context.SaveChanges();
}
var specProps = GetSpecProps(path);
using(var context = new DbContext()){
foreach(var specProp in specProps){
Property prop;
// отправляет запрос на сервер, а как читать из "кеша"?
prop = context.Property.FirstOrDefault( p => ...);
if(prop == null){
prop = new Property(){ ... };
context.Property.Add(prop);
}
// как здесь добавить запись в FileProperties?
// System.Data.Entity.Infrastructure.DbUpdateException:
// Не удалось обновить набор EntitySet "FileProperties",
// поскольку в нем имеется запрос DefiningQuery и
// отсутствует элемент
Ответ
Варианта тут два.
Вариант первый: вы загружаете таблицу на клиент целиком и помещаете в словарь для быстрого поиска по ней в памяти. Разумеется, это будет работать только если таблица маленькая:
var allProps = context.Properties.ToDictionary(p => p.property_name);
Только не надо в таком случае создавать по контексту БД на каждый файл, да еще и два раза. Вы можете в одном и том же контексте записать в БД сразу все файлы. За одну операцию сохранения.
Вариант второй. Надо ввести новую сущность, которая не будет иметь отображения в БД. Вместо этого, операция вставки будет отображена на хранимую процедуру, которая проверит существование свойства и создаст его при необходимости, после чего вернет ключ найденного или созданного свойства.
Комментариев нет:
Отправить комментарий