【发布时间】:2015-01-18 06:54:23
【问题描述】:
我已经创建了一个通用存储库来在 MVC 项目中进行 CRUD 操作。
当我尝试从具有 SQLServer 标识的表中删除一行时,由 Ormlite Delete 方法生成并使用探查器检查的代码不会影响任何行。
这是删除的 Crud 操作(很简单):
public void Destroy<T>(T entity)
{
using (var db = dbFactory.Open())
{
db.Delete<T>(entity);
}
}
我的测试中的类型T由以下类表示:
[Alias("FT_TEST_DEVELOPMENT")]
public class TestTable
{
[AutoIncrement]
[PrimaryKey]
public int ID { get; set; }
public string DESCR { get; set; }
public DateTime? TIMESTAMP { get; set; }
public DateTime DATE { get; set; }
public decimal PRICE { get; set; }
public int? QTY { get; set; }
}
并且被检查的代码对应如下:
exec sp_executesql N'DELETE FROM "FT_TEST_DEVELOPMENT" WHERE "ID"=@ID AND "DESCR"=@DESCR AND "TIMESTAMP"=@TIMESTAMP AND "DATE"=@DATE AND "PRICE"=@PRICE AND "QTY"=@QTY ',
N'@ID int,@DESCR nvarchar(6),@TIMESTAMP datetime,@DATE datetime,@PRICE decimal(2,0),@QTY int',
@ID=4,@DESCR=N'SECOND',@TIMESTAMP=NULL,@DATE='2015-06-01 00:00:00',@PRICE=15,@QTY=NULL
当我执行这个完美感知的语句时,服务器告诉我没有行
免责声明:有些名字是我的母语,我翻译了它们,所以可能会有一点语法错误,如果是这样,让我记下,我会编辑。
更新
匹配的行实际上存在于数据库中
SELECT * FROM FT_TEST_DEVELOPMENT WHERE ID= 4 ID 描述 时间戳 日期 价格 数量 4 第二个空 2015-06-01 15 空
我的意思是实际上 OrmLite 生成的代码似乎有问题。
是的,ID 列是表的键。
第二次更新 我想我找到了原因:
实际上在WHERE 子句中,NULL 字段的分配方式
@TIMESTAMP=NULL
但实际上SQL服务器不会匹配这个语句,因为它期望接收
WHERE [...] AND "TIMESTAMP" IS NULL [...]
【问题讨论】:
-
您将
ID定义为表中的主键还是只是IDENTITY?IDENTITY不将字段标记为主键 -
卡利斯佩拉!我也尝试了 [PrimaryKey] 属性,但没有任何改变,无论如何我会编辑问题,THX
-
您需要将 [PrimaryKey] 放在那里并确保 ID 是桌子上的主键。另外,我怀疑
db.Delete<T>()是一个错字,你的意思是db.Delete<T>(entity)。所有这一切都应该更改语句的WHERE子句以仅检查 ID 字段。还要确保有行符合条件
标签: c# servicestack ormlite-servicestack