Entity Framework 更新模式之Attach与EntityState.Modified模式的区别
程序员文章站
2022-07-03 17:50:51
数据库中有一个City表 初始时数据: 实体类与Fluent Api配置映射 public class City { public int Id { get; set; } public string Name { get; set; } public int? ParentId { get; se ......
数据库中有一个City表
初始时数据:
实体类与Fluent Api配置映射
public class City { public int Id { get; set; } public string Name { get; set; } public int? ParentId { get; set; } }
public class CityMap : EntityTypeConfiguration<City> { public CityMap() { ToTable("City"); HasKey(c => c.Id); Property(c => c.Name).HasMaxLength(50); } }
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); } }
方式一,使用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://msdn.microsoft.com/en-us/data/jj592676
上一篇: Oracle中用序列和触发器实现ID自增