BExIS.Dlm.Services.Data.DatasetManager.editDatasetVersion C# (CSharp) Метод

editDatasetVersion() приватный Метод

private editDatasetVersion ( DatasetVersion workingCopyDatasetVersion, List createdTuples, ICollection editedTuples, ICollection deletedTuples, ICollection unchangedTuples ) : DatasetVersion
workingCopyDatasetVersion BExIS.Dlm.Entities.Data.DatasetVersion
createdTuples List
editedTuples ICollection
deletedTuples ICollection
unchangedTuples ICollection
Результат BExIS.Dlm.Entities.Data.DatasetVersion
        private DatasetVersion editDatasetVersion(DatasetVersion workingCopyDatasetVersion, List<DataTuple> createdTuples, ICollection<DataTuple> editedTuples, ICollection<long> deletedTuples, ICollection<DataTuple> unchangedTuples)
        {
            Contract.Requires(workingCopyDatasetVersion.Dataset != null && workingCopyDatasetVersion.Dataset.Id >= 0);
            Contract.Requires(workingCopyDatasetVersion.Dataset.Status == DatasetStatus.CheckedOut);

            Contract.Ensures(Contract.Result<DatasetVersion>() != null && Contract.Result<DatasetVersion>().Id >= 0);

            // be sure you are working on the latest version (working copy). applyTupleChanges takes the working copy from the DB
            List<DataTupleVersion> tobeAdded = new List<DataTupleVersion>();
            List<DataTuple> tobeDeleted = new List<DataTuple>();
            List<DataTuple> tobeEdited = new List<DataTuple>();

            DatasetVersion editedVersion = applyTupleChanges(workingCopyDatasetVersion, ref tobeAdded, ref tobeDeleted, ref tobeEdited, createdTuples, editedTuples, deletedTuples, unchangedTuples);

            #region main code
            //using (IUnitOfWork uow = this.GetUnitOfWork())
            //{
            //    IRepository<DatasetVersion> repo = uow.GetRepository<DatasetVersion>();
            //    IRepository<DataTupleVersion> tupleVersionRepo = uow.GetRepository<DataTupleVersion>();
            //    IRepository<DataTuple> tupleRepo = uow.GetRepository<DataTuple>();

            //    // depends on how applyTupleChanges adds the tuples to its PriliminaryTuples!
            //    if (createdTuples != null)
            //    {
            //        foreach (DataTuple tuple in createdTuples)
            //        {
            //            tupleRepo.Put(tuple);
            //        }
            //    }

            //    if (tobeAdded != null)
            //    {
            //        foreach (DataTupleVersion dtv in tobeAdded)
            //        {
            //            tupleVersionRepo.Put(dtv);
            //        }
            //    }
            //    //foreach (var editedTuple in tobeEdited)
            //    //{
            //    //    editedTuple.VariableValues.ToList().ForEach(p => System.Diagnostics.Debug.Print(p.Value.ToString()));
            //    //    System.Diagnostics.Debug.Print(editedTuple.XmlVariableValues.AsString());
            //    //}
            //    if (tobeDeleted != null)
            //    {
            //    foreach (DataTuple tuple in tobeDeleted)
            //    {
            //        tupleRepo.Delete(tuple);
            //    }
            //    }
            //    // check whether the changes to the latest version, which is changed in the applyTupleChanges , are committed too!
            //    repo.Put(editedVersion);
            //    uow.Commit();
            //}
            #endregion

            #region <<------ experimental code ------>>
            // Check the same scenario using stateless session/ BulkUnitOfWork
            using (IUnitOfWork uow = this.GetBulkUnitOfWork())
            {
                IRepository<DataTupleVersion> tupleVersionRepo = uow.GetRepository<DataTupleVersion>();
                IRepository<DataTuple> tupleRepo = uow.GetRepository<DataTuple>();

                // depends on how applyTupleChanges adds the tuples to its PriliminaryTuples!
                if (createdTuples != null && createdTuples.Count >0)
                {
                    int batchSize = uow.PersistenceManager.PreferredPushSize;
                    List<DataTuple> processedTuples = null;
                    long iterations = createdTuples.Count / batchSize;
                    if (iterations * batchSize < createdTuples.Count)
                        iterations++;
                    for (int round = 0; round < iterations; round++)
                    {
                        processedTuples = createdTuples.Skip(round * batchSize).Take(batchSize).ToList();
                        processedTuples.ForEach(tuple => tuple.Dematerialize());
                        tupleRepo.Put(processedTuples);
                        uow.ClearCache(true); //flushes one batch of the tuples to the DB
                        processedTuples.Clear();
                        GC.Collect();
                    }
                }

                if (tobeAdded != null && tobeAdded.Count > 0)
                {
                    int batchSize = uow.PersistenceManager.PreferredPushSize;
                    List<DataTupleVersion> processedTuples = null;
                    long iterations = tobeAdded.Count / batchSize;
                    if (iterations * batchSize < tobeAdded.Count)
                        iterations++;
                    for(int round = 0; round < iterations; round++)
                    {
                        processedTuples = tobeAdded.Skip(round * batchSize).Take(batchSize).ToList();
                        tupleVersionRepo.Put(processedTuples);
                        uow.ClearCache(true); //flushes one batch of tuples
                        processedTuples.Clear();
                        GC.Collect();
                    }
                }
                //foreach (var editedTuple in tobeEdited)
                //{
                //    editedTuple.VariableValues.ToList().ForEach(p => System.Diagnostics.Debug.Print(p.Value.ToString()));
                //    System.Diagnostics.Debug.Print(editedTuple.XmlVariableValues.AsString());
                //}
                if (tobeDeleted != null && tobeDeleted.Count > 0)
                {
                    int batchSize = uow.PersistenceManager.PreferredPushSize;
                    List<DataTupleVersion> processedTuples = null;
                    long iterations = tobeAdded.Count / batchSize;
                    if (iterations * batchSize < tobeAdded.Count)
                        iterations++;
                    for (int round = 0; round < iterations; round++)
                    {
                        processedTuples = tobeAdded.Skip(round * batchSize).Take(batchSize).ToList();
                        tupleVersionRepo.Delete(processedTuples);
                        uow.ClearCache(true); //flushes one batch of tuples
                        processedTuples.Clear();
                        GC.Collect();
                    }
                }
                // check whether the changes to the latest version, which is changed in the applyTupleChanges , are committed too!
                uow.Commit();
            }
            #endregion

            using (IUnitOfWork uow = this.GetUnitOfWork())
            {
                IRepository<DatasetVersion> repo = uow.GetRepository<DatasetVersion>();
                repo.Put(editedVersion); // must be updated in a tracked session
                uow.Commit();
            }
            return (editedVersion);
        }