1. 程式人生 > >EF Core怎麽只Update實體的部分列數據

EF Core怎麽只Update實體的部分列數據

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 = new
TestDBContext()) { 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實體的部分列數據