FileTable и внешний ключ из другой таблицы
Я пытаюсь использовать FileTable с Entity Framework (я знаю, что он не поддерживается напрямую). Поэтому я использую пользовательские команды Sql для вставки и удаления (без обновления) данных. Моя проблема в том, что у меня есть таблица, которая ссылается на FileTable с внешним ключом для stream_id FileTable. Если я вставлю в FileTable, как я могу вернуть stream_id?
Я хочу использовать SqlBulkCopy для вставки большого количества файлов, я могу массово вставить в FileTable, но SqlBulkCopy не скажет мне вставленные значения stream_id.
Если я выполняю одиночные операторы вставки с помощью select scopeIdentity() или чего-то подобного, производительность ухудшается.
Я хочу вставить примерно 5000 файлов (от 2 МБ до 20 МБ) в FileTable и связать их с моей собственной таблицей через внешний ключ. Это плохая практика, и я должен использовать столбец простого пути и хранить данные непосредственно в файловой системе? Я думал, что FileTable делает именно это для меня, потому что мне нужно защитить базу данных, и файлы всегда синхронизируются, даже если я ухожу на один час или 4 дня назад. Я не могу выполнить резервное копирование базы данных и файловой системы одновременно, поэтому они синхронизированы на 100%.
1 ответ
Я хочу использовать SqlBulkCopy для вставки большого количества файлов, я могу массово вставить в FileTable, но SqlBulkCopy не скажет мне вставленные значения stream_id.
SqlBulkCopy не позволяет извлекать вставленные значения идентичности или любые другие значения.
Решение 1
В Интернете вы можете найти множество фрагментов кода для вставки во временную таблицу с помощью SqlBulkCopy. Затем из временной таблицы в таблицу назначения, используя предложение OUTPUT, чтобы получить значения stream_id.
Это еще несколько шагов, но производительность по-прежнему очень велика.
Решение 2
Отказ от ответственности: я владелец проекта http://entityframework-extensions.net/
Отказ от ответственности: я владелец проекта Bulk Operations
Обе библиотеки не являются бесплатными, но позволяют легче преодолеть ограничение SqlBulkCopy.
Они оба поддерживают вывод значения идентичности.
// Easy to customize
var bulk = new BulkOperation<Customer>(connection);
bulk.BatchSize = 1000;
bulk.ColumnInputExpression = c => new { c.Name, c.FirstName };
bulk.ColumnOutputExpression = c => c.CustomerID;
bulk.ColumnPrimaryKeyExpression = c => c.Code;
bulk.BulkMerge(customers);
// Easy to use
var bulk = new BulkOperation(connection);
bulk.BulkInsert(dt);
bulk.BulkUpdate(dt);
bulk.BulkDelete(dt);
bulk.BulkMerge(dt);