我已经构建了一个通用的存储库,以在MVC项目中进行CRUD操作。ServiceStack的Ormlite删除不起作用
当我尝试从SQLServer上具有标识的表中删除一行时,由Ormlite Delete
方法生成的代码和使用分析器检查不会影响任何行。
这是删除(非常简单)渣滓操作:
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"[email protected] AND "DESCR"[email protected] AND "TIMESTAMP"[email protected] AND "DATE"[email protected] AND "PRICE"[email protected] AND "QTY"[email protected] ',
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
当我执行这个完美的感觉d语句服务器告诉我,没有行
免责声明:因为有些名称在我的母语中,我翻译过它们,所以可能会有小的语法错误,如果是这样,请让我注意一下,然后我会编辑。
UPDATE
匹配行实际上在数据库
SELECT * FROM FT_TEST_DEVELOPMENT WHERE ID = 4 ID DESCR TIMESTAMP DATE价格数量 4 SECOND NULL 2015年6月1日15 NULL
EXISTS我的意思是实际上OrmLite生成的代码似乎被窃听。
是的,ID列是表的关键。
第二次更新 我想我已经找到了症结:
其实WHERE
子句中的NULL字段的方式
@TIMESTAMP=NULL
分配,但实际上SQL服务器将不匹配此声明,因为它期望收到
WHERE [...] AND "TIMESTAMP" IS NULL [...]
您是否将'ID'定义为表中的主键,还是仅仅是一个'IDENTITY'? 'IDENTITY'不会将字段标记为主键 – 2015-01-15 15:57:32
Kalispera!我也尝试过使用** [PrimaryKey] **属性,但没有任何改变,无论如何,我将编辑问题,THX – Pizzaboy 2015-01-15 16:00:38
您需要将[PrimaryKey]放在*和*确保ID是主键表。此外,我怀疑'db.Delete()'是一个错字,你的意思是'db.Delete (实体)'。所有这些都应该改变语句的'WHERE'子句来仅检查ID字段。还要确保有*行*符合条件 –
2015-01-15 16:03:43