EF Core怎麽只Update實體的部分列數據
阿新 • • 發佈:2018-10-11
hang man new 開始 pan 效率 key pda set
下面是EF Core中的一個Person實體:
public partial class Person { public int Id { get; set; } public string Code { get; set; } public string Name { get; set; } public DateTime? CreateTime { get; set; } public DateTime? UpdateTime { get; set; } }
其中我們通過Fluent API指定了Code是Key屬性,用來Update和Delete數據:
modelBuilder.Entity<Person>(entity => { entity.Property(e => e.Id).ValueGeneratedOnAdd(); entity.HasKey(e => e.Code);//聲明列Code是實體的Key屬性 });
現在我們可以通過代碼先new一個Person實體,然後聲明其Key屬性列Code的值,及要修改的列Name的值,這樣EF Core就會為我們生成只修改列Name的Sql語句:
using (TestDBContext testDBContext = newTestDBContext()) { Person person = new Person() { Code = "A" ,Name="Tom"};//列Code是Key,聲明Key屬性列Code的值,及要修改的列Name的值 testDBContext.Attach(person);//告訴EF Core開始跟蹤person實體的更改 testDBContext.Entry(person).Property(p => p.Name).IsModified = true;//告訴EF Core實體person的Name屬性已經更改,需要在下面SaveChanges的時候在數據庫中Update該列testDBContext.SaveChanges(); }
這樣就避免了因為要通過EF Core去修改一個實體的值,必須要先從數據庫中取出該實體,再Update回去,造成效率低下。我們可以看到如下EF Core在後臺生成的SQL語句,其通過Update只更新了Person表Name列的值,並沒更新其它列的值:
=============================== EF Core log started =============================== Executed DbCommand (23ms) [Parameters=[@p1=‘?‘ (Size = 450), @p0=‘?‘ (Size = 50)], CommandType=‘Text‘, CommandTimeout=‘30‘] SET NOCOUNT ON; UPDATE [Person] SET [Name] = @p0 WHERE [Code] = @p1; SELECT @@ROWCOUNT; =============================== EF Core log finished ===============================
EF Core怎麽只Update實體的部分列數據