Entity Framework 更新模式之Attach與EntityState.Modified模式的區別


數據庫中有一個City表

 

初始時數據:

 

 

實體類與Fluent Api配置映射

public class City { public int Id { get; set; } public string Name { get; set; } public int? ParentId { get; set; } }
View Code
public class CityMap : EntityTypeConfiguration<City> { public CityMap() { ToTable("City"); HasKey(c => c.Id); Property(c => c.Name).HasMaxLength(50); } }
View Code

Entity Framework 上下文類

 

public class EFContext : DbContext
{
    public EFContext() : base("name=MyConnection")
    {

    }

    public DbSet<City> Citys  { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<EFContext>(null);
        modelBuilder.Configurations.Add(new CityMap());
        base.OnModelCreating(modelBuilder);

    }

}
View Code

 

 

 

 方式一,使用Attach,並更新某個屬性的值(注意,不是所有的屬性都作修改)

using (var context = new EFContext()) { //方式一
var entity = context.Citys.Find(4); context.Citys.Attach(entity); entity.Name = "肇慶"; context.SaveChanges(); }

將深圳修改成了肇慶,從Sql Profiler中可以看出,生成的update語句,只是修改了name列

using (var context = new EFContext()) { //方式二
    var model = context.Citys.Find(5); model.Name = "潮州"; context.Entry(model).State = System.Data.Entity.EntityState.Modified; context.SaveChanges(); }

將珠海修改成潮州,注意,本次沒有修改ParentId,但是Sql Profiler中生成的語句看出,Update語句修改了所有列(主鍵除外)

將一個entity標記為System.Data.Entity.EntityState.Modified更新時會更新所有的列(而不僅是修改了列),實際該使用哪種方式視場合而定。

最后數據庫中數據為:

 

參考資料:

https://stackoverflow.com/questions/30987806/dbset-attachentity-vs-dbcontext-entryentity-state-entitystate-modified

https://msdn.microsoft.com/en-us/data/jj592676

 

 


免責聲明!

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



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