执行扩展会抛出DbUpdateException吗?

时间:2016-03-22 07:37:38

标签: c# entity-framework dapper

我在我的通用存储库中添加了一个新方法来直接从数据库中删除记录,而不是通过DbConext然后调用它SaveChanges

所以我做了:

    public virtual void Delete(int id)
    {
        var connection = dataContext.GetDatabase().Connection;
        var query = string.Format("DELETE FROM {0} WHERE id = {1}", tableName, id);

        connection.Execute(query);
    }

我当前使用DbContext句柄DbUpdateException删除实体的代码,此异常会影响到客户端。

Dapper的Execute扩展名是否也会抛出此异常?

2 个答案:

答案 0 :(得分:1)

  1. 不,不是;如果你想要这样,你应该在select @@rowcount之后使用delete执行ExecuteScalar<int>之后的操作,并检查返回的数字是1。如果你想要时间戳检查,你可以在where子句中包含它并作为参数

  2. 永远,永远,永远不会将输入连接到SQL的数据部分;它会产生SQL注入风险,并破坏所有查询/操作缓存 - 第一个原因是你应该需要的所有东西。这里有一些警告,比如表名,但你应该在那里列入白名单。请注意,dapper支持完整参数化(简单的参数处理是使用它的主要原因之一!)

  3. 例如,我会做类似的事情:

    public YourType(string tableName) { // constructor
        WhiteList.AssertValid(tableName); // throws if not allowed
        deleteCommand = $"DELETE FROM [{tableName}] WHERE id = @id; SELECT @@ROWCOUNT;";
    }
    private readonly string deleteCommand;
    public virtual void Delete(int id)
    {
        var connection = dataContext.GetDatabase().Connection;
        int count = connection.ExecuteScalar<int>(deleteCommand, new { id });
        if(count != 0) throw new DbUpdateException();
    }
    

    或者,使用像dapper-contrib这样的附加工具,为你完成所有这些工作。

答案 1 :(得分:0)

我知道这不是实际问题的答案,但imho,你应该去找

Finding the reason for DbUpdateException

这样,您可以覆盖Execute方法,找到根本原因并解决它。