EntityFramework 更新數據庫字段的三種方法(復習用)
阿新 • • 發佈:2018-08-05
too 圖片 long title .cn 創建數據庫 toolbar 註意 比較 轉自https://www.cnblogs.com/cuihongyu3503319/p/8671006.html
EntityFramework 更新數據庫字段的三種方法
例:
實體類:
public class TestDbContext : DbContext { public DbSet<Test> Tests { get; set; } public TestDbContext() : base() { } } public class Test { public long ID { get; set; } public string Name { get; set; } public string Email { get; set; } public string Remarks { get; set; } }
創建數據庫
TestDbContext db = new TestDbContext(); db.Tests.Add(new Test() { Name = "測試1", Email= @"[email protected]", Remarks = "測試1備註"}); db.Tests.Add(new Test() { Name = "測試2", Email = @"[email protected]", Remarks = "測試2備註"}); db.SaveChanges();
更新數據 第一種方法:
先查詢記錄,然後修改相應的屬性。此方法雖然多了一個查詢步驟,但是也由此利用了EF的自動跟蹤功能,後續操作比較方便。
比如,生成的SQL語句只會去修改相應的修改過的字段。
而且經測試發現,如果實體屬性值沒有改變,不會生成SQL語句,比如將下面的代碼執行兩次,第二次 SaveChanges() 方法不會執行SQL更新語句(註:由於還是會執行一次查詢,所以運行效率並沒有顯著提升)
TestDbContext db = new TestDbContext(); var test = db.Tests.Find(1); test.Remarks = "更新字段方法1"; db.SaveChanges();
第二種方法:
直接創建一個新的實體類,然後修改實體對象的狀態。此方法雖然少了一個查詢步驟,但生成的SQL語句將會修改全部字段,而且還要確保 ID 值存在。(註意:由於會修改全部字段,沒有設置的字段會被設置為null)
TestDbContext db = new TestDbContext(); Test test = new Test() { ID = 1, Remarks = "更新字段方法2" }; db.Entry(test).State = System.Data.Entity.EntityState.Modified; db.SaveChanges();
第三種方法:
創建一個實體類,將實體附加到數據庫上下文,然後修改相應屬性值的修改標識為 true ,此方法生成的SQL語句與第一種方法一樣,比較簡潔,而且還少了查詢步驟,只是後續的操作比較麻煩,因為要手動設置各個屬性的修改標識,還要確保 ID 值存在。
TestDbContext db = new TestDbContext(); Test test = new Test() { ID = 1, Remarks = "更新字段方法3" }; db.Tests.Attach(test); db.Entry(test).Property("Remarks").IsModified = true; db.SaveChanges();
生成的SQL語句(使用 SQL Server Profiler 跟蹤數據庫所得): 第一種方法:(註:第一種方法的代碼執行一次後再次執行沒有跟蹤到更新數據庫的SQL語句)
exec sp_executesql N‘UPDATE [dbo].[Tests] SET [Remarks] = @0 WHERE ([ID] = @1) ‘,N‘@0 nvarchar(max) ,@1 bigint‘,@0=N‘更新字段方法1‘,@1=1
第二種方法:(註:查看SQL語句可知,使用此方法如果不註意可能會導致數據被錯誤修改)
exec sp_executesql N‘UPDATE [dbo].[Tests] SET [Name] = NULL, [Email] = NULL, [Remarks] = @0 WHERE ([ID] = @1) ‘,N‘@0 nvarchar(max) ,@1 bigint‘,@0=N‘更新字段方法2‘,@1=1
第三種方法
exec sp_executesql N‘UPDATE [dbo].[Tests] SET [Remarks] = @0 WHERE ([ID] = @1) ‘,N‘@0 nvarchar(max) ,@1 bigint‘,@0=N‘更新字段方法3‘,@1=1
EntityFramework 更新數據庫字段的三種方法(復習用)