예제 #1
0
        /// <summary>
        ///     Sync the Changes to this Collection to the Database
        /// </summary>
        public void SaveChanges(DbAccessLayer layer)
        {
            var bulk    = layer.Database.CreateCommand("");
            var removed = new List <T>();

            foreach (var pair in _internalCollection)
            {
                IDbCommand tempCommand;
                switch (pair.Value)
                {
                case CollectionStates.Added:
                    tempCommand = layer.CreateInsertWithSelectCommand(typeof(T), pair.Key);
                    break;

                case CollectionStates.Removed:
                    tempCommand = DbAccessLayer.CreateDelete(layer.Database, layer.GetClassInfo(typeof(T)), pair.Key);
                    removed.Add(pair.Key);
                    break;

                case CollectionStates.Unchanged:
                    tempCommand = null;
                    break;

                case CollectionStates.Changed:
                    tempCommand = layer.CreateUpdate(pair.Key, layer.Database);
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                if (tempCommand != null)
                {
                    bulk = layer.Database.MergeCommands(bulk, tempCommand, true);
                }
            }

            var results = layer.ExecuteMARS(bulk, typeof(T)).SelectMany(s => s).Cast <T>().ToArray();
            //Added
            var added = _internalCollection.Where(s => s.Value == CollectionStates.Added).ToArray();

            for (var i = 0; i < added.Length; i++)
            {
                var addedOne = added[i];
                var newId    = results[i];
                DataConverterExtensions.CopyPropertys(addedOne.Value, newId, layer.Config);
            }

            //Removed
            foreach (var item in removed)
            {
                _internalCollection.Remove(item);
            }

            foreach (var collectionStatese in _internalCollection.Keys.ToArray())
            {
                ChangeState(collectionStatese, CollectionStates.Unchanged);
            }
        }
예제 #2
0
 public ConditionalEvalQuery <T> UpdateEntity <T>(T obj)
 {
     return(new ConditionalEvalQuery <T>(new UpdateQuery <T>(this
                                                             .QueryCommand(
                                                                 DbAccessLayer
                                                                 .CreateUpdate(ContainerObject
                                                                               .AccessLayer.Database, ContainerObject.AccessLayer.GetClassInfo(typeof(T)), obj)))));
 }