Sql 如何先用EF6/代码注入参数?

Sql 如何先用EF6/代码注入参数?,sql,vb.net,entity-framework,procedures,Sql,Vb.net,Entity Framework,Procedures,我试图弄清楚在使用MapToStoredProcess时如何将参数注入EntityFramework6。这可能吗 我只想将当前登录的用户名从应用程序传递到存储过程,但我似乎不知道EF6在哪里进行实际调用 编辑:更多信息 好的,没有MapToStoredProcess(也就是让EF6直接使用表),我可以在重写的SaveChangesSync方法中执行以下操作: For Each Entry As DbEntityEntry In Me.ChangeTracker.Entries().Where(F

我试图弄清楚在使用MapToStoredProcess时如何将参数注入EntityFramework6。这可能吗

我只想将当前登录的用户名从应用程序传递到存储过程,但我似乎不知道EF6在哪里进行实际调用

编辑:更多信息

好的,没有MapToStoredProcess(也就是让EF6直接使用表),我可以在重写的SaveChangesSync方法中执行以下操作:

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()与我的delete存储过程一起传递,以设置ArchiveBy参数


希望这能更好地说明我在尝试做什么。

生活对你来说再容易不过了。运行如下所示的操作:

    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);
    }
在存储库中添加以下内容:

    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);
    }
并按如下方式使用:

    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"));
        });
    }
}

我正在尝试与EF的ChangeTracker合作。。。我的想法是重写EF的Entity.Delete,因为我以为EF会在那里调用存储过程,但我似乎不知道如何重写它。。。