我正在将EF用于我的Web应用程序,并且遇到了一个奇怪的错误。我正在尝试更新数据库中的一条记录,但是即使context.Database.ExecuteSqlCommand
调用返回1,当我再调用context.SaveChanges()
时,它也会返回0,并且更改在数据库中不可见。
代码如下:
List<int> ids = new List<int> { 1, 2, 3 };
using (var context = new TestDbContext())
{
int rows=context.Database.ExecuteSqlCommand("UPDATE [Records] SET [ExampleFlag] = 1 WHERE Id in (@ids)",new SqlParameter("@ids",String.Join(",", ids)));
int rows2 = context.SaveChanges();
}
出于某种原因,在调试时,行等于1,但行2等于0。好像无法将更改提交到数据库。
关于什么可能导致这种情况的任何想法?
答案 0 :(得分:1)
这两种写入数据库的方式几乎是两个不同的世界。
像实体框架这样的对象关系映射器(ORM)的核心功能是保持一个对象模型(例如,在C#中)和一个关系数据库模型彼此同步。因此,它能够跟踪对象模型中的更改并将这些更改写入数据库。
出于礼貌,某些ORM提供了较低级别的API与数据库进行交互。但是,这些功能不会与ORM功能交互,反之亦然。
换句话说,无论DbContext.Database.ExecuteSqlCommand
执行什么语句,EF的变更跟踪器都完全忽略了它。如果没有实体对象被C#代码修改,则更改跟踪器没有任何关系。执行的SQL代码对跟踪的实体对象无效。