似乎有两种方法使用"attach"方法更新断开连接的Entity Framework实体.
方法一是简单地将断开连接的实体的状态设置为已修改:
myDbContext.Dogs.Attach(dog);
myDbContext.Entry(dog).State = EntityState.Modified;
myDbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
这将保存"dog"对象上的所有字段.但是你说你是在一个mvc网页上做的,你只允许编辑Dog.Name,页面上唯一的Dog属性是Name.然后可以做方法二:
myDbContext.Dogs.Attach(dog);
myDbContext.Entry(dog).Property(o => o.Name).CurrentValue = dog.Name;
myDbContext.Entry(dog).Property(o => o.Name).IsModified = true;
myDbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
当有许多属性需要更新时,方法二可能会变得非常冗长.这促使我尝试方法三,在我不想改变的属性上设置IsModified = false.这不起作用,抛出运行时错误"不支持修改属性的设置IsModified为false":
myDbContext.Dogs.Attach(dog);
myDbContext.Entry(dog).State = EntityState.Modified;
myDbContext.Entry(dog).Property(o => o.Owner).IsModified = false;
myDbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
我更喜欢在任何地方使用Method One,但是在很多情况下我的asp.net mvc视图不包含Dog类的每个标量属性.
我的问题是:
PS我知道另一种方法,不使用"附加",只需从数据库中获取一个新对象,更新所需的属性,然后保存.这就是我正在做的事情,但我很好奇是否有一种方法可以使用"附加",从而避免额外的数据库访问,但这样做的方式不像上面的方法二那么冗长.通过"获取一个新鲜的对象"我的意思是:
Dog dbDog = myDbContext.Dogs.FirstOrDefault(d => d.ID = dog.ID);
dbDog.Name = dog.Name;
myDbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)