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; } }
public class CityMap : EntityTypeConfiguration<City>
{
public CityMap()
{
ToTable("City");
HasKey(c => c.Id);
Property(c => c.Name).HasMaxLength();
}
}
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();
context.Citys.Attach(entity);
entity.Name = "肇庆";
context.SaveChanges();
}
将深圳修改成了肇庆,从Sql Profiler中可以看出,生成的update语句,只是修改了name列

using (var context = new EFContext())
{
//方式二
var model = context.Citys.Find();
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
Entity Framework 更新模式之Attach与EntityState.Modified模式的区别的更多相关文章
- Entity Framework 更新失败,调试后发现是AsNoTracking的原因
public override int SaveChanges() { var changedEntities = ChangeTracker.Entries().Where(e => e.St ...
- 关于Entity Framework更新的几种方式以及可能遇到的问题(附加类型“Model”的实体失败,因为相同类型的其他实体已具有相同的主键值)在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 时如果图形中的任何实体具有冲突键值,则可能会发生上述行为
在日常使用Entity Framework中,数据更新通常会用到.下面就简单封装了一个DBContext类 public partial class EFContext<T> : DbCo ...
- C# Entity Framework 更新数据的三种方法
例: 实体类: public class TestDbContext : DbContext { public DbSet<Test> Tests { get; set; } public ...
- Oracle + Entity Framework 更新没有设置主键的表
最近用Entity Framework 开发的时候,发现一个问题,在默认情况下,EF不能对一个没有主键的表进行更新.插入和删除的动作. 那么,应该怎么处理没有主键的表呢? 我们打开这个表的edmx文件 ...
- Entity Framework应用:Code First的实体继承模式
Entity Framework的Code First模式有三种实体继承模式 1.Table per Type (TPT)继承 2.Table per Class Hierarchy(TPH)继承 3 ...
- EntityFramework_MVC4中EF5 新手入门教程之六 ---6.通过 Entity Framework 更新关联数据
在前面的教程中,您将显示相关的数据 :在本教程中,您会更新相关的数据.对于大多数的关系,这个目标是可以通过更新相应的外键字段来达到的.对于多对多关系,实体框架并不直接,暴露联接表,因此您必须显式添加和 ...
- Entity Framework应用:根据实体的EntityState状态实现增删改查
在上一篇文章中,我们讲解了使用EF实现简单的增删改成,在这篇文章中我们使用实体的EntityState状态来优化数据的增删改查. 一.修改数据 上篇文章中的修改数据的方法是EF官方推荐的方式,即先查询 ...
- Entity Framework应用:使用EF的DataBase First模式实现数据库的增删改查
在上一篇文章中讲解了如何生成EF的DBFirst模式,接下来讲解如何使用DBFirst模式实现数据库数据的增删改查 一.新增数据 新增一个Student,代码如下: static void Add() ...
- Entity Framework 更新带外键的实体为null
using (var ctx = new PortalContext()){ var city = ctx.Cities.Find(42); ctx.Entry(city) ...
随机推荐
- windows10下找回照片查看器的方法(仅作记录)
Windows Registry Editor Version 5.00 ; Change Extension's File Type [HKEY_CURRENT_USER\Software\Clas ...
- test11
-Xms512m-Xmx512m-XX:PermSize=512-XX:MaxPermSize=512
- springboot-15-启动时加载数据的方法CommandLineRunner
有时需要爱项目启动时, 去加载一些配置文件什么的, 可以使用监听器的方式加载, 这是可以通过实现接口 CommandLineRunner来实现需求: Spring Boot应用程序在启动后,会遍历Co ...
- Installing haproxy load balancing for http and https--转载
This example will guide you through a simple IP based load balancing solution that handles ssl traff ...
- Spring配置Quartz任务调度、及 ThreadPool 线程池
ONE.除了引入 Spring 相关的 jar 包,还要引入 Quartz 的 jar 包 <dependency> <groupId>org.springframework& ...
- Head First Python学习笔记4——处理数据
有这么几组数据需要你处理: James 2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22 Julia 2.59,2.11,2:11,2:23,3-10,2-23 ...
- sql2000-text类型数据只能看到256个字节
工具只能看到256个字节,其实数据是完整的,可以自己写个程序取数据试一试
- C#/Net代码精简优化技巧
(一) 在我们写代码的时候可以使用一些小的技巧来使代码变得更加简洁,易于维护和高效.下面介绍几种在C#/Net中非常有用的一些编程技巧. 1 空操作符(??) 在程序中经常会遇到对字符串或是对象判断n ...
- [疑难杂症]解决实际开发中各种问题bug
我有一个习惯就是遇到问题找到解决方案后收藏网页.后来遇到问题越来越多,收藏就多得有点离谱了.我反思了一下,其实有用的信息就那么点,那我干脆还是做成网页剪报好了. 关于VS的 Problem:未能正确加 ...
- mysql 修改初始化密码【转】
转:http://www.jb51.net/article/39454.htm 方法1: 用SET PASSWORD命令 首先登录MySQL. 格式:mysql> set password fo ...