public override int SaveChanges(SaveOptions options) { int returnValue = 0; // 因为我们不调用base.SaveChanges, 我们必须手动关闭链接. // 否则我们将留下许多打开的链接, 最终导致链接瓶颈. // Entity Framework提供了base.SaveChanges内部使用的EnsureConnection和ReleaseConnection. // 这些是内部方法, 所以我们必须使用反射调用它们. var EnsureConnectionMethod = typeof(ObjectContext).GetMethod( "EnsureConnection", BindingFlags.Instance | BindingFlags.NonPublic); EnsureConnectionMethod.Invoke(this, null); // 使用ObjectStateManager.GetObjectStateEntries完成增加,修改,和删除集合. foreach (ObjectStateEntry ose in this.ObjectStateManager.GetObjectStateEntries(EntityState.Added)) { Travel travel = ose.Entity as Travel; if (travel != null) { RetryPolicy retryPolicy = new RetryPolicy(); retryPolicy.Task = new Action(() => { this.InsertIntoTravel(travel.PartitionKey, travel.Place, travel.GeoLocationText, travel.Time); }); retryPolicy.Execute(); returnValue++; } } foreach (ObjectStateEntry ose in this.ObjectStateManager.GetObjectStateEntries(EntityState.Modified)) { Travel travel = ose.Entity as Travel; if (travel != null) { RetryPolicy retryPolicy = new RetryPolicy(); retryPolicy.Task = new Action(() => { this.UpdateTravel(travel.PartitionKey, travel.RowKey, travel.Place, travel.GeoLocationText, travel.Time); }); retryPolicy.Execute(); returnValue++; } } foreach (ObjectStateEntry ose in this.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted)) { Travel travel = ose.Entity as Travel; if (travel != null) { RetryPolicy retryPolicy = new RetryPolicy(); retryPolicy.Task = new Action(() => { this.DeleteFromTravel(travel.PartitionKey, travel.RowKey); }); retryPolicy.Execute(); returnValue++; } } var ReleaseConnectionMethod = typeof(ObjectContext). GetMethod("ReleaseConnection", BindingFlags.Instance | BindingFlags.NonPublic); ReleaseConnectionMethod.Invoke(this, null); return returnValue; }
public override int SaveChanges(SaveOptions options) { int returnValue = 0; // 因为我们不调用base.SaveChanges, 我们必须手动关闭链接. // 否则我们将留下许多打开的链接, 最终导致链接瓶颈. // Entity Framework提供了base.SaveChanges内部使用的EnsureConnection和ReleaseConnection. // 这些是内部方法, 所以我们必须使用反射调用它们. var EnsureConnectionMethod = typeof(ObjectContext).GetMethod( "EnsureConnection", BindingFlags.Instance | BindingFlags.NonPublic); EnsureConnectionMethod.Invoke(this, null); // 使用ObjectStateManager.GetObjectStateEntries完成增加,修改,和删除集合. foreach (ObjectStateEntry ose in this.ObjectStateManager.GetObjectStateEntries(EntityState.Added)) { Travel travel = ose.Entity as Travel; if (travel != null) { RetryPolicy retryPolicy = new RetryPolicy(); retryPolicy.Task = new Action(() => { this.InsertIntoTravel(travel.PartitionKey, travel.Place, travel.GeoLocationText, travel.Time); }); retryPolicy.Execute(); returnValue++; } } foreach (ObjectStateEntry ose in this.ObjectStateManager.GetObjectStateEntries(EntityState.Modified)) { Travel travel = ose.Entity as Travel; if (travel != null) { RetryPolicy retryPolicy = new RetryPolicy(); retryPolicy.Task = new Action(() => { this.UpdateTravel(travel.PartitionKey, travel.RowKey, travel.Place, travel.GeoLocationText, travel.Time); }); retryPolicy.Execute(); returnValue++; } } foreach (ObjectStateEntry ose in this.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted)) { Travel travel = ose.Entity as Travel; if (travel != null) { RetryPolicy retryPolicy = new RetryPolicy(); retryPolicy.Task = new Action(() => { this.DeleteFromTravel(travel.PartitionKey, travel.RowKey); }); retryPolicy.Execute(); returnValue++; } } var ReleaseConnectionMethod = typeof(ObjectContext). GetMethod("ReleaseConnection", BindingFlags.Instance | BindingFlags.NonPublic); ReleaseConnectionMethod.Invoke(this, null); return(returnValue); }
public override int SaveChanges(SaveOptions options) { int returnValue = 0; // Since we do not call base.SaveChanges, we have to take care of connections manually. // Otherwise we may leave a lot of connections open, which results in connection throttle. // Entity Framework provides EnsureConnection and ReleaseConnection which base.SaveChanges uses internally. // They're internal methods, so we have to use reflection to invoke them. var EnsureConnectionMethod = typeof(ObjectContext).GetMethod( "EnsureConnection", BindingFlags.Instance | BindingFlags.NonPublic); EnsureConnectionMethod.Invoke(this, null); // Use ObjectStateManager.GetObjectStateEntries to obtain added, modified, and deleted entities. foreach (ObjectStateEntry ose in this.ObjectStateManager.GetObjectStateEntries(EntityState.Added)) { Travel travel = ose.Entity as Travel; if (travel != null) { RetryPolicy retryPolicy = new RetryPolicy(); retryPolicy.Task = new Action(() => { this.InsertIntoTravel(travel.PartitionKey, travel.Place, travel.GeoLocationText, travel.Time); }); retryPolicy.Execute(); returnValue++; } } foreach (ObjectStateEntry ose in this.ObjectStateManager.GetObjectStateEntries(EntityState.Modified)) { Travel travel = ose.Entity as Travel; if (travel != null) { RetryPolicy retryPolicy = new RetryPolicy(); retryPolicy.Task = new Action(() => { this.UpdateTravel(travel.PartitionKey, travel.RowKey, travel.Place, travel.GeoLocationText, travel.Time); }); retryPolicy.Execute(); returnValue++; } } foreach (ObjectStateEntry ose in this.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted)) { Travel travel = ose.Entity as Travel; if (travel != null) { RetryPolicy retryPolicy = new RetryPolicy(); retryPolicy.Task = new Action(() => { this.DeleteFromTravel(travel.PartitionKey, travel.RowKey); }); retryPolicy.Execute(); returnValue++; } } var ReleaseConnectionMethod = typeof(ObjectContext). GetMethod("ReleaseConnection", BindingFlags.Instance | BindingFlags.NonPublic); ReleaseConnectionMethod.Invoke(this, null); return(returnValue); }