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