Я знаю, что вы уже приняли ваш ответ, но я все еще хотел показать вам хорошую альтернативу, которая может быть полезна и в вашем случае. Сейчас или в будущем.
При использовании хранимых процедур целесообразно использовать T4
Я склонен использовать хранимые процедуры в своем проекте, даже если он не использует PetaPoco, Dapper или Massive (проект начался раньше, чем они были здесь). Вместо этого он использует BLToolkit. Тем не мение. Вместо того, чтобы писать свои методы для запуска хранимых процедур и писать код для обеспечения параметров хранимых процедур, я написал шаблон T4 , который генерирует код для меня.
Всякий раз, когда хранимые процедуры изменяются (некоторые могут быть добавлены / удалены, параметры добавлены / удалены / переименованы / перепечатаны), мой код будет прерываться при компиляции, поскольку вызовы методов больше не будут совпадать с их сигнатурой.
Я храню свои хранимые процедуры в файле (поэтому они контролируются версией). Если вы работаете в команде разработчиков, может быть целесообразно иметь хранимые процедуры, каждая в своем собственном файле. Это делает обновления гораздо менее болезненными. Я испытал это на каком-то проекте, и он работал нормально, пока количество SP невелико. Вы можете реструктурировать их в папки на основе сущности, с которой они связаны.
Так или иначе. Обслуживание связано с хранимыми процедурами, изменение кода - это просто нажатие кнопки в Visual Studio, которая конвертирует все T4 одновременно. Вам не нужно искать ваши методы, которые используют эти процедуры. Вам сообщат об ошибках во время компиляции. Одной вещи меньше беспокоиться.
Так что вместо того, чтобы писать
using (var db = new DbManager())
{
return db
.SetSpCommand(
"Person_SaveWithRelations",
db.Parameter("@Name", name),
db.Parameter("@Email", email),
db.Parameter("@Birth", birth),
db.Parameter("@ExternalID", exId))
.ExecuteObject<Person>();
}
и имея кучу волшебных строк, я могу просто написать:
using (var db = new DataManager())
{
return db
.Person
.SaveWithRelations(name, email, birth, exId)
.ExecuteObject<Person>();
}
Это приятнее, чище ломает компиляцию и обеспечивает intellisense, так что это также быстрее при разработке.
Хорошо, что хранимые процедуры могут стать очень сложными и могут делать много вещей. В моем верхнем примере я проверяю некоторые данные, вставляю личную запись, а также связанную с ней и в конце возвращаю только что вставленную Person
запись. Вставки и обновления должны обычно возвращать данные, которые были добавлены / изменены, чтобы отразить фактическое состояние.