instance session.Delete("ToDoTasks/1-A"); // delete by ID 这里咬住,Delete 方法并不会删除文档,只是将文档在会话中标记为在已删除,只有在调用 SaveChanges 我们修改或者删除文档后,同样也需要调用SaveChanges 方法来更新 RavenDB,而且利用 Query 查询出来的文档在会话中也只有一个实例,不管你查询了多少次。 person = new Person { Name = "Oscar Arava" }; session.Store(person); 同样,与 Delete 方法一样,只有在调用 SaveChanges SaveChanges() SaveChanges 方法的作用是检查所有删除和更改的会话状态,然后将这些作为一个事务发送到服务器,因此这就保证了不会因为中途产生异常而部分保存失败。 调用 SaveChanges 方法时,将检查数据库中加载的实体和当前的实体是否有变动。如果有变动,那么该实体将被保存到数据库中。
ModelState.IsValid) //后台的验证信息 { db.CarModel.AddObject(car); db.SaveChanges db.CarModel.Attach(model); UpdateModel(model); db.SaveChanges = new Model.HotelModelContainer(); db.Customer.Add(entity); int count = db.SaveChanges null) { db.Customer.Remove(cus); } int count = db.SaveChanges true; db.Entry(entity).State = EntityState.Modified; int count = db.SaveChanges
使用SaveChangesInterceptor需要实现DbContextInterceptor类中的BeforeSaveChanges和AfterSaveChanges方法,分别在执行SaveChanges BlogContext>() .UseSqlServer(connectionString) .AddInterceptors(new TimestampInterceptor()); 这样,当SaveChanges context.Database.EnsureCreated(); context.TestEntities.IgnoreQueryFilters().ExecuteDelete(); context.SaveChanges test data context.TestEntities.Add(new SoftDeleteEntity() { Id = 1, Name = "test" }); context.SaveChanges 1); ArgumentNullException.ThrowIfNull(testEntity); context.TestEntities.Remove(testEntity); context.SaveChanges
Gender = "male" }; db.User.Add(user); db.SaveChanges //方法二:把当前实体的状态改为删除 //db.Entry(user).State = EntityState.Deleted; db.SaveChanges //把当前实体的状态改为Modified db.Entry(user).State = EntityState.Modified; db.SaveChanges setEntry.SetModifiedProperty("Name"); setEntry.SetModifiedProperty("Age"); db.SaveChanges Gender = "male" }; db.User.Add(user1); db.SaveChanges
.)); } 自动重试与事物 对于执行自动重试策略来说,每一次调用context.SaveChanges()方法将会当做一个重试单元。 如果你的事物中有多个SaveChanges操作,配置的自动重试策略将会抛出异常,解决方法是使用委托来手动调用执行策略。 context.Blogs.Add(new Blog {Url = "http://blogs.msdn.com/dotnet"}); context.SaveChanges (); context1.SaveChanges(); transaction.Complete(); } strategy.ExecuteInTransaction(db, operation: context => { context.SaveChanges
"张三", Age = 12 } db.User.Attach(user); db.Entry(user).State = EntityState.Unchanged; db.SaveChanges 标记为 Added 状态时,表明尸体上下文被追踪但是不存在于数据库中,当我们调用 SaveChanges 方法时数据将保存进数据库。 = new User() { Name = "张三" Age = 12 } db.Entry(user).State = EntityState.Added; db.SaveChanges (); } 三、Deleted 如果需要将实体从数据库中删除,可以使用 Deleted 状态,当调用 SaveChanges 方法时数据将会从数据库中删除。 (); } 四、Modified 当我们修改数据时,需要用到 Modified 状态,当调用 SaveChanges 方法时数据将会修改数据库中的数据。
ef.Users.FirstOrDefault(p => p.Id == userId); user1.Name = "李四"; db.SaveChanges (); user2.Name = "王五"; ef.SaveChanges(); } } ef.Users.FirstOrDefault(p => p.Id == userId); user1.Name = "李四"; db.SaveChanges 函数来处理异常并正确解决冲突,最后在调用 SaveChanges 方法重试提交数据。 捕获并发异常,其实我们也可以自定义 SaveChanges 的扩展方法来处理并发异常。
下面要说一下 上下文的 context.SaveChanges()了。 我们应该都知道的,如果我们操作上下文对数据库进行了 增、删、改的操作,那么操作结束后需要有一个 context.SaveChanges()的操作,用来把对实体的修改保存到数据库中。 这里呀,我们明明可以只交互一次就搞定的呀,怎么做呢,我们可以在把SaveChanges()的操作从UserDal中迁移到UserService中的呀,在UserDal中的每个方法先不写context.SaveChanges () 13 { 14 return DbContextFactory.GetCurrentDbContext().SaveChanges(); 15 当然,不要忘记回到Dal层,把原来代码中的SaveChanges操作去掉:去掉后代码如下: 1 public class BaseDal<T> where T : class , new() 2
public override int SaveChanges(SaveOptions options) { foreach (EntityObject entity System.Reflection.BindingFlags.Instance).SetValue(entity, null); } } return base.SaveChanges
SaveChanges的外移 在之前介绍EF Core的时候,我们提到过使用EF需要在每次使用之后,调用一次SaveChanges将数据提交给数据库。 在实际开发中,我们不能添加一条数据或者做一次修改就调用一次SaveChanges,这完全不现实。 因为每次调用SaveChanges是EF向数据库提交变更的时候,所以EF推荐的是每次执行完用户的请求之后统一提交数据给数据库。 这样就会造成一个问题,可能也不是问题:我们需要一个接口来管理EF 的SaveChanges操作。 我的建议是创建一个ActionFilter,针对所有的控制器进行SaveChanges进行处理。
= context; } return context; } } public int SaveChanges throw dbEx; } catch (Exception ex) { Logger.Info("SaveChanges ex; } } while (saveFailed); return i; } } 这里我们主要定义一个属性Database和一个方法SaveChanges SaveChanges就是调用Database的SaveChanges方法来保存数据的修改,当然,我们对该方法进行了一些封装,让他更饱满一些。 repo = new Kiba_UserRepo(); repo.Add(new Kiba_User() { UserName = "kiba518" }); repo.SaveChanges
UserInfo user = new UserInfo(); user.userName = "BBB"; user.passWord = "23456"; db.UserInfo.Add(user); db.SaveChanges (); 需要注意的是,在执行完添加操作之后,需要执行 db.SaveChanges() 操作, 这句话的意思是,把我们修改的内容更新到数据库中。 user.passWord = "1234567"; 然后执行修改操作: db.Entry(user).State = EntityState.Modified; 最后将修改保存到数据库中 db.SaveChanges user.userId = 3; user.userName = "DDD"; db.Entry(user ).Property(u => u.userName).IsModified = true; db.SaveChanges UserInfo(); user.userId = 3; db.Entry<UserInfo>(user).State = System.Data.Entity.EntityState.Deleted; db.SaveChanges
当调用SaveChanges时,所有的更改将通过事务一次性提交到数据库。 同时,我们注意到Insert、Update、Delete方法都显式的调用了SaveChanges方法。 至此,我们完成了从实体到聚合再到仓储的定义和实现,万事俱备,只欠Uow。 4.5. 但这似乎引入了另外一个问题,因为仓储是管理单一聚合的,每次做增删改时都显式的提交了更改(调用了SaveChanges),在处理多个聚合时,就无法利用DbContext进行批量提交了。那该如何是好? 我们抽离SaveChanges方法,定义IUnitOfWork接口。 中Insert、Update、Delete方法中的显式保存调用_dbContext.SaveChanges();。
m) { try { Model.Add(m); Entities.SaveChanges { try { Model.AddRange(m); Entities.SaveChanges ) { try { Model.Remove(t); Entities.SaveChanges try { Model.RemoveRange(m); return Entities.SaveChanges model = Entities.Set<TM>(); model.RemoveRange(tmMs); return Entities.SaveChanges
list).State = EntityState.Added; 也可以这样写 //forth step:告诉上下文,执行保存操作 dbContext.SaveChanges dbContext.Entry(list).State = EntityState.Modified; //将当前实体标记为修改 dbContext.SaveChanges list).State = EntityState.Added; 也可以这样写 //forth step:告诉上下文,执行保存操作 dbContext.SaveChanges dbContext.Entry(list1).State = EntityState.Modified; //将当前实体标记为修改 dbContext.SaveChanges 3、当我们在操作完数据库对应的表示表实体后,执行dbContext.SaveChanges()后,编译器报一个实体或多个实体验证失败!
}; db.Entry(jeffrey).State = EntityState.Added; db.SaveChanges => m.PersonId == 4).FirstOrDefault(); db.Persons.Remove(person); db.SaveChanges .FirstOrDefault(); db.Entry(person).State = EntityState.Deleted; db.SaveChanges m.PersonId == 3).FirstOrDefault(); person.PersonName="UpdateNewName"; db.SaveChanges
EF Core通过ChangeTracker跟踪需要写入数据库的更改,当需要保存数据时,调用DbContext的SaveChanges方法完成保存。 // remove var lastBlog = context.Blogs.Last(); context.Blogs.Remove(lastBlog); context.SaveChanges (); } 关联数据 在EF Core中,除了独立的模型外,还有与模型关联的数据,这部分数据通过独立模型添加到模型中,在SaveChanges时将会持久化到数据库中。 默认情况下,每次SaveChanges方法的所保存的所有更改都将在一个事务中,要么全部保存成功,要么全部保存失败。此种情况已能满足大多数应用的需要。 工作原理:每当在 SaveChanges 期间执行更新或删除操作时,会将数据库上的并发令牌值与通过 EF Core 读取的原始值进行比较。如果一致则可以完成操作,如果不一致,则终止事务。
expression.Close (SaveChanges, FileName, RouteWorkbook) 代码示例: Option Explicit Option Base 1 Sub test wb.Close SaveChanges:=True MsgBox "Done!" End Sub 打开一份Excel文件,编辑结束后,保存内容并关闭。 ' 获取内容 content = wb.Sheets(1).Range("A1").Value2 MsgBox content wb.Close SaveChanges 2)在wb.Close SaveChanges:=True之前添加一句代码,Application.Windows(wb.name).Visible = True。 wb.Sheets(1).Range("A2").Value2 = "No 2" Application.Windows(wb.Name).Visible = True wb.Close SaveChanges
}; db.Entry(jeffrey).State = EntityState.Added; db.SaveChanges => m.PersonId == 4).FirstOrDefault(); db.Persons.Remove(person); db.SaveChanges => m.PersonId == 4).FirstOrDefault(); db.Persons.Remove(person); db.SaveChanges public int Insert(TEntity entity) { Entities.Add(entity); return EF.SaveChanges entity) { EF.Entry(entity).State = EntityState.Modified; return EF.SaveChanges
在EF中采用IsConcurrencyToken配置后RowVersion即自动用于where子句中用于比较Row Version,通过重写SaveChanges方法在每次添加和更新时设置RowVersion Database.SetInitializer(new MySqlDbInitializer()); } 3.手动对RowVersion赋值 public override int SaveChanges System.Text.Encoding.UTF8.GetBytes(Guid.NewGuid().ToString()); } } return base.SaveChanges Set<Customer>().FirstOrDefault(); customer2.PhoneNumber = "t2"; db2.SaveChanges (); } db1.SaveChanges(); } 7.查看测试结果: ?