Использование хранимых процедур для выполнения операций 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;