1. 程式人生 > >EntityFramework 更新數據庫字段的三種方法(復習用)

EntityFramework 更新數據庫字段的三種方法(復習用)

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 更新數據庫字段的三種方法(復習用)