我在我的通用存储库中添加了一个新方法来直接从数据库中删除记录,而不是通过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
扩展名是否也会抛出此异常?
答案 0 :(得分:1)
不,不是;如果你想要这样,你应该在select @@rowcount
之后使用delete
执行ExecuteScalar<int>
之后的操作,并检查返回的数字是1
。如果你想要时间戳检查,你可以在where
子句中包含它并作为参数
永远,永远,永远不会将输入连接到SQL的数据部分;它会产生SQL注入风险,并破坏所有查询/操作缓存 - 第一个原因是你应该需要的所有东西。这里有一些警告,比如表名,但你应该在那里列入白名单。请注意,dapper支持完整参数化(简单的参数处理是使用它的主要原因之一!)
例如,我会做类似的事情:
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)