Два возможных подхода:
$stmt = $pdo->prepare('INSERT INTO foo VALUES(:v1_1, :v1_2, :v1_3),
(:v2_1, :v2_2, :v2_3),
(:v2_1, :v2_2, :v2_3)');
$stmt->bindValue(':v1_1', $data[0][0]);
$stmt->bindValue(':v1_2', $data[0][1]);
$stmt->bindValue(':v1_3', $data[0][2]);
// etc...
$stmt->execute();
Или:
$stmt = $pdo->prepare('INSERT INTO foo VALUES(:a, :b, :c)');
foreach($data as $item)
{
$stmt->bindValue(':a', $item[0]);
$stmt->bindValue(':b', $item[1]);
$stmt->bindValue(':c', $item[2]);
$stmt->execute();
}
Если данные для всех строк находятся в одном массиве, я бы использовал второе решение.
Другой способ сделать это - использовать классы сопоставления, использовать EF исключительно для доступа к данным и использовать классы EF, созданные только в DAL, а затем сопоставить эти объекты DAL с объектами вашего BLL с помощью преобразователей. У нас это хорошо работает.
Не в структуре сущностей, но я попытался создать образец с двумя хранимыми процедурами вставки, выполняемыми отдельно на уровне доступа к данным (с использованием блока приложения доступа к данным 3.1), заключенных внутри контекста TransactionScope в Service / BLL, не сработало. Одна вставка прошла, другая не прошла, и данные БЫЛИ зафиксированы.
Удалось ли вам сделать это самому?
Я подозреваю, что это может быть ответом на вашу проблему:
http://code.msdn.microsoft.com/EFPocoAdapter/Release/ProjectReleases.aspx?ReleaseId=1580
Инструмент генерирует классы, не зависящие от структуры сущностей, которые можно передавать по уровням.