2014-10-16 3 views
0

Я пытаюсь понять, как вводить параметр в Entity Framework 6 при использовании MapToStoredProcedures. Возможно ли это?Как ввести параметр EF6/Code First?

Я просто хочу передать свое зарегистрированное имя пользователя из приложения в хранимую процедуру, но я не могу понять, где EF6 выполняет фактический вызов.

EDIT: Немного больше информации

Итак, БЕЗ MapToStoredProcedures (ака позволяя EF6 просто использовать таблицы непосредственно), я могу сделать следующее в моем переопределен метод SaveChangesAsync:

For Each Entry As DbEntityEntry In Me.ChangeTracker.Entries().Where(Function(o) o.State = EntityState.Deleted) 
    If TypeOf Entry.Entity Is ISoftDelete Then 
     'Implements Soft Delete interface, so let's do what needs doing. 

     Select Case Entry.Entity.GetType() 
      Case GetType(OS) 
       Dim _thisOS As OS = TryCast(Entry.Entity, OS) 

       Using db As New AppRegistrationContext 
        _thisOS = Await db.OSSet.Include("OSType").FirstOrDefaultAsync(Function(o) o.ID = _thisOS.ID) 
       End Using 

         If Not _thisOS Is Nothing Then 
          Try 
           Entry.Reference("OSType").CurrentValue = _thisOS.OSType 
          Catch ex As Exception 
           Debug.Print(ex.ToString) 
          End Try 

         End If 
        Case GetType(Server) 

        Case Else 
         'Do nothing - only filling in extra information for those that we need to 
       End Select 

       'Set the archival bits 
       Entry.Property("Archive").CurrentValue = True 
       Entry.Property("ArchiveDate").CurrentValue = Date.Now 
       Entry.Property("ArchiveBy").CurrentValue = HttpContext.Current.User.Identity.Name.ToString() 

       'Mark it modified 
       Entry.State = EntityState.Modified 

      End If 
     Next 

Return Await MyBase.SaveChangesAsync() 

Alright, что работает отлично с прямым столом манипулирования от имени EF.

Что я хочу сделать вместо этого, обрабатывает все это в хранимых процедурах, но мне нужно передать HttpContext.Current.User.Identity.Name.ToString() С моей хранимой процедурой удаления, чтобы установить параметр ArchiveBy.

Надеюсь, это лучше иллюстрирует то, что я пытаюсь сделать.

ответ

0

Жизнь не может быть проще для вас. Выполнить что-то вроде следующего:

В репозитории добавить следующее:

public void ExecuteSqlCommand(string sql, params object[] parameters) 
    { 
     DbContext.Database.ExecuteSqlCommand(sql, parameters); 
    } 

и использовать его так же, как следующее:

public void DoSomething(int officeId) 
    { 
     var sqlParam = new SqlParameter("p0", officeId); 

     var parameters = new object[] { sqlParam }; 

     ((GenericRepository)Repository).ExecuteSqlCommand("EXEC dbo.myProc @p0", parameters); 
    } 

или просто позвонить

DbContext.Database.ExecuteSqlCommand 

как я показал выше, исходя из ваших потребностей.

Update 1: Вы хотите, чтобы хранимая процедура, чтобы заботиться о CRUD бизнеса:

Предположим, что ваш контекст называется: MyDbContext

Затем объявить что-то вроде следующего в частичном классе MyDbContext:

Теперь каждый раз, когда вы хотите выполнить некоторую процедуру CRUD, операция будет выполняться через хранимую процедуру [Тот, который вы набрали), и вам не нужно беспокоиться ут передавая что-либо к хранимой процедуре:

using (var context = new MyDbContext()) 
{ 
    context.SomeCustomEntity.Add(new SomeCustomEntity 
    { 
     Name = "Jack Something", 
     Phone = "999" 
    }); 

    context.SaveChanges(); 
} 
+0

Я пытаюсь работать с ChangeTracker EF в ... моя мысль была, что я бы переопределить Entity.Delete EF, поскольку именно там я думал, что EF бы вызвать хранимую процедуру , но я не могу понять, как его переопределить ... – John

Смежные вопросы