【问题标题】:Sanitize sql input parameters using Entity Framework使用实体框架清理 sql 输入参数
【发布时间】:2017-11-23 13:12:39
【问题描述】:

我正在使用实体框架 EDMX,它会自动生成存储过程执行所需的函数,作为基于 DBContext 类的自动生成类的一部分。

例如,这是一个自动生成的函数来执行存储过程:

public virtual ObjectResult<Company> GetCompanies(string companyName)
    {
        var companyNameParameter = companyName != null ?
            new ObjectParameter("CompanyName", companyName) :
            new ObjectParameter("CompanyName", typeof(string));

        return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Company>("GetCompanies", companyNameParameter);
    }

由于我在一些存储过程中使用动态 SQL,我想覆盖 ExecuteFunction 并使用“自定义 ExecuteFunction”函数在那里添加一些清理函数,这些函数将循环遍历每个参数并对其进行清理。我想知道,也许我可以创建一个自定义 ObjectContext 类并以某种方式使用它?

我怎样才能以我仍然能够使用 EDMX 实体框架自动生成函数的方式做到这一点?

我知道有一些解决方案可以清理 SP 内的参数,但我仍然想了解如何将自定义 ExecuteFunction 函数或自定义 ObjectContext 与 EDMX 一起使用。

【问题讨论】:

  • 你不应该来清理它......如果问题是你正在连接值并使用EXEC (@sql) - 那么:don'不要那样做 - 你应该使用EXEC sp_executesql @sql, N'{args definition}', @arg0, @arg1, ... - 它允许你完全参数化动态SQL;更多上下文:docs.microsoft.com/en-us/sql/relational-databases/…
  • @MarcGravell 我知道,但我仍然想了解如何将自定义 ExecuteFunction 函数或自定义 ObjectContext 与 EDMX 一起使用。

标签: c# entity-framework


【解决方案1】:

我怎样才能以我仍然能够使用 EDMX 实体框架自动生成函数的方式做到这一点?

由于生成的函数是虚函数,您可以在子类中覆盖它们。

例如

public class MyDbContext2 : MyDbContext
{
    public override ObjectResult<Company> GetCompanies(string companyName)
    {
       Sanatize(companyname);
       return base.GetCompanies(companyName);
    }
//. . .
}

【讨论】:

  • 这样,我需要对需要在 MyDBContext 中清理的每个函数执行此操作。是否有一个选项可以通过继承 ObjectContext 以某种方式覆盖 ExecuteFunction 函数?
  • AFAIK 没有。而且您只需要对使用动态 SQL 的过程执行此操作,而不需要清理存储过程本身中的输入参数。
猜你喜欢
  • 1970-01-01
  • 2017-01-14
  • 2014-03-30
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多