Entitiy Framework context.Database.ExecuteSqlCommand不会将更改保存到数据库

时间:2018-07-27 15:14:27

标签: sql-server entity-framework-6

我正在将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。好像无法将更改提交到数据库。

关于什么可能导致这种情况的任何想法?

1 个答案:

答案 0 :(得分:1)

这两种写入数据库的方式几乎是两个不同的世界。

像实体框架这样的对象关系映射器(ORM)的核心功能是保持一个对象模型(例如,在C#中)和一个关系数据库模型彼此同步。因此,它能够跟踪对象模型中的更改并将这些更改写入数据库。

出于礼貌,某些ORM提供了较低级别的API与数据库进行交互。但是,这些功能不会与ORM功能交互,反之亦然。

换句话说,无论DbContext.Database.ExecuteSqlCommand执行什么语句,EF的变更跟踪器都完全忽略了它。如果没有实体对象被C#代码修改,则更改跟踪器没有任何关系。执行的SQL代码对跟踪的实体对象无效。