Przeglądaj źródła

added transaction on crud delete; tests

tags/v0.3.0
Robin Thoni 7 lat temu
rodzic
commit
0d148ffc03

+ 100
- 55
Luticate2.Utils/DataAccess/LuEfCrudDataAccess.cs Wyświetl plik

@@ -114,18 +114,34 @@ namespace Luticate2.Utils.DataAccess
114 114
 
115 115
 
116 116
 
117
+        protected virtual LuResult<T> _Add<T>(TDboCreate obj, TDbContext db, DbSet<TModel> table)
118
+        {
119
+            return LuResult<T>.Ok(default(T));
120
+        }
117 121
 
118 122
         public virtual LuResult<T> Add<T>(IEnumerable<TDboCreate> objs, Func<IEnumerable<TDboRead>, T> returnFunc)
119 123
         {
120
-            var models = objs.Select(GetModelFromTCreate).ToList();
124
+            var models = new List<TModel>();
121 125
             var addRes = Execute((db, table) =>
122 126
             {
123
-                table.AddRange(models);
127
+                var transact = BeginTransaction(db);
128
+                foreach (var dbo in objs)
129
+                {
130
+                    var model = GetModelFromTCreate(dbo);
131
+                    table.Add(model);
132
+                    models.Add(model);
133
+                    var res = _Add<T>(dbo, db, table);
134
+                    if (!res)
135
+                    {
136
+                        return res;
137
+                    }
138
+                }
124 139
                 db.SaveChanges();
125 140
                 foreach (var model in models)
126 141
                 {
127 142
                     db.Entry(model).State = EntityState.Detached;
128 143
                 }
144
+                CommitTransaction(transact);
129 145
                 return LuResult<T>.Ok(default(T));
130 146
             });
131 147
             if (!addRes)
@@ -304,71 +320,97 @@ namespace Luticate2.Utils.DataAccess
304 320
 
305 321
 
306 322
 
307
-        public virtual LuResult<T> Edit<T>(Expression<Func<TModel, bool>> predicate, Action<TModel> update,
308
-            Func<IEnumerable<TDboRead>, T> returnFunc)
323
+
324
+//        public virtual LuResult<T> Edit<T>(Expression<Func<TModel, bool>> predicate, Action<TModel> update,
325
+//            Func<IEnumerable<TDboRead>, T> returnFunc)
326
+//        {
327
+//            IList<TModel> models = null;
328
+//            var editRes = Execute((db, table) =>
329
+//            {
330
+//                models = GetEditQueryable(db, table).Where(predicate).AsNoTracking().ToList();
331
+//                foreach (var model in models)
332
+//                {
333
+//                    update(model);
334
+//                    db.Entry(model).State = EntityState.Modified;
335
+//                }
336
+//                db.SaveChanges();
337
+//                return LuResult<T>.Ok(default(T));
338
+//            });
339
+//            if (!editRes)
340
+//            {
341
+//                return editRes;
342
+//            }
343
+//            return GetMultiple(models, returnFunc);
344
+//        }
345
+//
346
+//        public virtual LuResult<IEnumerable<TId>> EditId(Expression<Func<TModel, bool>> predicate, Action<TModel> update)
347
+//        {
348
+//            var func = GetIdFunc<TId>();
349
+//            return Edit(predicate, update, reads => reads.Select(func));
350
+//        }
351
+//
352
+//        public virtual LuResult<IEnumerable<TDboRead>> EditDbo(Expression<Func<TModel, bool>> predicate, Action<TModel> update)
353
+//        {
354
+//            return Edit(predicate, update, read => read);
355
+//        }
356
+
357
+
358
+//        public virtual LuResult<T> EditSingleById<T>(TId id, Action<TModel> update, Func<TDboRead, T> returnFunc)
359
+//        {
360
+//            var guid = GetId(id);
361
+//            if (guid == null)
362
+//            {
363
+//                return GetNotFoundResult<T>();
364
+//            }
365
+//            return Edit(GetExpression(new KeyValuePair<string, object>("id", guid)), update,
366
+//                list => returnFunc(list.FirstOrDefault()));
367
+//        }
368
+//
369
+//        public virtual LuResult<TId> EditSingleByIdId(TId id, Action<TModel> update)
370
+//        {
371
+//            return EditSingleById(id, update, GetIdFunc<TId>());
372
+//        }
373
+//
374
+//        public virtual LuResult<TDboRead> EditSingleByIdDbo(TId id, Action<TModel> update)
375
+//        {
376
+//            return EditSingleById(id, update, read => read);
377
+//        }
378
+
379
+        protected virtual LuResult<T> _EditSingleById<T>(TId id, TModel model, TDboUpdate obj, TDbContext db, DbSet<TModel> table)
380
+        {
381
+            return LuResult<T>.Ok(default(T));
382
+        }
383
+
384
+        public virtual LuResult<T> EditSingleById<T>(TId id, TDboUpdate update, Func<TDboRead, T> returnFunc)
309 385
         {
310
-            IList<TModel> models = null;
386
+            var guid = GetId(id);
387
+            if (guid == null)
388
+            {
389
+                return GetNotFoundResult<T>();
390
+            }
391
+            var transact = BeginTransaction(null);
311 392
             var editRes = Execute((db, table) =>
312 393
             {
313
-                models = GetEditQueryable(db, table).Where(predicate).AsNoTracking().ToList();
314
-                foreach (var model in models)
394
+                var model = GetEditQueryable(db, table).FirstOrDefault(GetExpression(new KeyValuePair<string, object>("id", guid)));
395
+                EditModelFromTUpdate(update, model);
396
+                var res = _EditSingleById<T>(id, model, update, db, table);
397
+                if (!res)
315 398
                 {
316
-                    update(model);
317
-                    db.Entry(model).State = EntityState.Modified;
399
+                    RollbackTransaction(transact);
400
+                    return res;
318 401
                 }
402
+                db.Entry(model).State = EntityState.Modified;
319 403
                 db.SaveChanges();
320 404
                 return LuResult<T>.Ok(default(T));
321 405
             });
322 406
             if (!editRes)
323 407
             {
408
+                RollbackTransaction(transact);
324 409
                 return editRes;
325 410
             }
326
-            return GetMultiple(models, returnFunc);
327
-        }
328
-
329
-        public virtual LuResult<IEnumerable<TId>> EditId(Expression<Func<TModel, bool>> predicate, Action<TModel> update)
330
-        {
331
-            var func = GetIdFunc<TId>();
332
-            return Edit(predicate, update, reads => reads.Select(func));
333
-        }
334
-
335
-        public virtual LuResult<IEnumerable<TDboRead>> EditDbo(Expression<Func<TModel, bool>> predicate, Action<TModel> update)
336
-        {
337
-            return Edit(predicate, update, read => read);
338
-        }
339
-
340
-
341
-        public virtual LuResult<T> EditSingleById<T>(TId id, Action<TModel> update, Func<TDboRead, T> returnFunc)
342
-        {
343
-            var guid = GetId(id);
344
-            if (guid == null)
345
-            {
346
-                return GetNotFoundResult<T>();
347
-            }
348
-            return Edit(GetExpression(new KeyValuePair<string, object>("id", guid)), update,
349
-                list => returnFunc(list.FirstOrDefault()));
350
-        }
351
-
352
-        public virtual LuResult<TId> EditSingleByIdId(TId id, Action<TModel> update)
353
-        {
354
-            return EditSingleById(id, update, GetIdFunc<TId>());
355
-        }
356
-
357
-        public virtual LuResult<TDboRead> EditSingleByIdDbo(TId id, Action<TModel> update)
358
-        {
359
-            return EditSingleById(id, update, read => read);
360
-        }
361
-
362
-
363
-        public virtual LuResult<T> EditSingleById<T>(TId id, TDboUpdate update, Func<TDboRead, T> returnFunc)
364
-        {
365
-            var guid = GetId(id);
366
-            if (guid == null)
367
-            {
368
-                return GetNotFoundResult<T>();
369
-            }
370
-            return Edit(GetExpression(new KeyValuePair<string, object>("id", guid)),
371
-                model => EditModelFromTUpdate(update, model), list => returnFunc(list.FirstOrDefault()));
411
+            var getRes = GetSingleById(id).To(returnFunc);
412
+            CommitTransaction(transact);
413
+            return getRes;
372 414
         }
373 415
 
374 416
         public virtual LuResult<TId> EditSingleByIdId(TId id, TDboUpdate update)
@@ -389,14 +431,17 @@ namespace Luticate2.Utils.DataAccess
389 431
         {
390 432
             return Execute((db, table) =>
391 433
             {
434
+                var transact = BeginTransaction(db);
392 435
                 var models = GetDeleteQueryable(db, table).Where(predicate).AsNoTracking().ToList();
393 436
                 var getRes = GetMultiple(models, returnFunc);
394 437
                 if (!getRes)
395 438
                 {
439
+                    RollbackTransaction(transact);
396 440
                     return getRes;
397 441
                 }
398 442
                 table.RemoveRange(models);
399 443
                 db.SaveChanges();
444
+                CommitTransaction(transact);
400 445
                 return getRes;
401 446
             });
402 447
         }

+ 507
- 508
TestUtils/EfCrudDataAccess/LuEfUpdateDataAccessTest.cs
Plik diff jest za duży
Wyświetl plik


Ładowanie…
Anuluj
Zapisz