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


下面是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數據(包括DbSet的Contains方法也是查找的實體的Key屬性值):

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實體的更改,因為調用DbContext.Attach方法后,EF Core會將person實體的State值(可以通過testDBContext.Entry(person).State查看到)更改回EntityState.Unchanged,所以這里testDBContext.Attach(person)一定要放在下面一行testDBContext.Entry(person).Property(p => p.Name).IsModified = true的前面,否者后面的testDBContext.SaveChanges方法調用后,數據庫不會被更新
    testDBContext.Entry(person).Property(p => p.Name).IsModified = true;//告訴EF Core實體person的Name屬性已經更改。將testDBContext.Entry(person).Property(p => p.Name).IsModified設置為true后,也會將person實體的State值(可以通過testDBContext.Entry(person).State查看到)更改為EntityState.Modified,這樣就保證了下面SaveChanges的時候會將person實體的Name屬性值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 ===============================

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM