我正在尝试弄清楚如何在使用MapToStoredProcedures时将参数注入Entity Framework 6。这甚至可能吗?
我只是想将我当前登录的用户名从应用程序传递给存储过程,但我似乎无法弄清楚WHERE EF6是否进行实际调用。
编辑:更多信息
好的,所以没有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()
好吧,代表EF使用直接表操作很好。
我想要做的是在存储过程中处理所有这些 - 但是我需要使用我的删除存储过程传递HttpContext.Current.User.Identity.Name.ToString()来设置ArchiveBy参数。
希望这能更好地说明我的目的。
答案 0 :(得分: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
正如我上面根据您的需要所示。
更新1 :您希望存储过程能够处理CRUD业务:
假设您的上下文被调用:MyDbContext
然后在部分MyDbContext类中声明如下内容:
public partial class MyDbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder
.Entity<SomeCustomEntity>()
.MapToStoredProcedures(agent =>
{
agent.Insert(i => i.HasName("spr_MyInsert"));
agent.Update(u => u.HasName("spr_MyUpdate"));
agent.Delete(d => d.HasName("spr_MyDelete"));
});
}
}
现在每次你想要做一些CRUD程序时,你的操作都将通过存储过程[你映射的那个]运行,你不必担心将任何东西传递给存储过程:
using (var context = new MyDbContext())
{
context.SomeCustomEntity.Add(new SomeCustomEntity
{
Name = "Jack Something",
Phone = "999"
});
context.SaveChanges();
}