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);
Другие вопросы по тегам