Использование хранимых процедур для выполнения операций INSERT|UPDATE|DELETE
Хранимые процедуры можно использовать, если свойства объектов имеют следующие типы:
-
System.Int16;
-
System.Int32;
-
System.Int64;
-
System.Single;
-
System.Double;
-
System.DateTime;
-
System.Boolean;
-
System.Decimal;
-
System.Guid;
-
System.Byte[] длиной до 3919 байт;
-
System.String длиной до 1959 символов.
Для использования хранимых процедур надо в классе контекста переопределить метод OnModelCreating(DbModelBuilder modelBuilder)
и для каждого пользовательского класса добавить следующую строку:
modelBuilder.Entity< [класс] >().MapToStoredProcedures();
Пример
using System; using System.ComponentModel.DataAnnotations; using System.Data.Entity; namespace Demo { // Класс автомобиль public class Auto { // Уникальный идентификатор объекта public int Id { get; set; } // Название автомобиля [MaxLength(1959)] public string Name { get; set; } } // Класс контекст для доступа к базе данных public class AutoContext : DbContext { public AutoContext() : base("User ID=SYSTEM;Password=MANAGER8;Persist Security Info=true") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // Отображение операций INSERT|UPDATE|DELETE на хранимые процедуры modelBuilder.Entity< Auto >().MapToStoredProcedures(); } public DbSet< Auto > Autos { get; set; } } class Program { static void Main(string[] args) { using (var context = new AutoContext()) { // Подключение к базе данных и создание таблицы, если она не существует context.Database.CreateIfNotExists(); // Добавление новой записи и сохранение изменений context.Autos.Add(new Auto { Name = "Автомобиль А" }); context.SaveChanges(); // Чтение записей из базы данных Console.WriteLine("Список авто:"); foreach (var auto in context.Autos) { Console.WriteLine(auto.Id + " | " + auto.Name); } Console.WriteLine("Для продолжения нажмите любую клавишу..."); Console.ReadKey(); } } } }
После выполнения примера в БД будут созданы три хранимые процедуры: "dbo"."Auto_Insert", "dbo"."Auto_Update" и "dbo"."Auto_Delete", которые можно изменить. Для этого в заголовке хранимых процедур необходимо заменить выражение CREATE IF NOT EXISTS
на выражение CREATE OR REPLACE
, внести необходимые изменения в код и сохранить хранимые процедуры:
create or replace procedure "dbo"."Auto_Insert"(in Name nvarchar(1959)) result cursor(Id int) declare var c typeof(result); code execute "insert into \"dbo\".\"Autoes\" (\"Name\") values (?)" using Name; open c for direct "select \"Id\" from \"dbo\".\"Autoes\" where \"Id\" = LAST_AUTOINC"; return c; end; create or replace procedure "dbo"."Auto_Update"(in Id int; in Name nvarchar(1959)) code execute "update \"dbo\".\"Autoes\" set \"Name\" = ? where \"Id\" = ?" using Name,Id; end; create or replace procedure procedure "dbo"."Auto_Delete"(in Id int) code execute "delete from \"dbo\".\"Autoes\" where \"Id\" = ?" using Id; end;