diff --git a/AsbCloudApp/Services/ICrudService.cs b/AsbCloudApp/Services/ICrudService.cs
index 859e8fd4..37dff698 100644
--- a/AsbCloudApp/Services/ICrudService.cs
+++ b/AsbCloudApp/Services/ICrudService.cs
@@ -69,7 +69,7 @@ namespace AsbCloudApp.Services
///
///
///
- /// если больше 0 - Id записи, если меньше 0 - код ошибки
+ /// количество добавленных, если меньше 0 - код ошибки
Task DeleteAsync(int id, CancellationToken token);
}
#nullable disable
diff --git a/AsbCloudInfrastructure/Services/CrudServiceBase.cs b/AsbCloudInfrastructure/Services/CrudServiceBase.cs
index 57cda971..c3e9fdb2 100644
--- a/AsbCloudInfrastructure/Services/CrudServiceBase.cs
+++ b/AsbCloudInfrastructure/Services/CrudServiceBase.cs
@@ -94,25 +94,32 @@ namespace AsbCloudInfrastructure.Services
{
var entity = Convert(item);
entity.Id = 0;
- dbSet.Add(entity);
+ var entry = dbSet.Add(entity);
await dbContext.SaveChangesAsync(token);
+ entry.State = EntityState.Detached;
return entity.Id;
}
///
- public virtual Task InsertRangeAsync(IEnumerable items, CancellationToken token = default)
+ public virtual async Task InsertRangeAsync(IEnumerable items, CancellationToken token = default)
{
if (!items.Any())
- return Task.FromResult(0);
+ return 0;
var entities = items.Select(i =>
{
var entity = Convert(i);
entity.Id = 0;
return entity;
});
-
- dbSet.AddRange(entities);
- return dbContext.SaveChangesAsync(token);
+ var entries = new List(items.Count());
+ foreach (var entity in entities)
+ {
+ var entry = dbSet.Add(entity);
+ entries.Add(entry);
+ }
+ var affected = await dbContext.SaveChangesAsync(token);
+ entries.ForEach(e => e.State = EntityState.Detached);
+ return affected;
}
///
@@ -122,11 +129,14 @@ namespace AsbCloudInfrastructure.Services
.AsNoTracking()
.FirstOrDefaultAsync(e => e.Id == item.Id, token)
.ConfigureAwait(false);
+
if (existingEntity is null)
return ICrudService.ErrorIdNotFound;
+
var entity = Convert(item);
var entry = dbSet.Update(entity);
await dbContext.SaveChangesAsync(token);
+ entry.State = EntityState.Detached;
return entry.Entity.Id;
}
@@ -138,8 +148,10 @@ namespace AsbCloudInfrastructure.Services
.FirstOrDefault(e => e.Id == id);
if (entity == default)
return Task.FromResult(ICrudService.ErrorIdNotFound);
- dbSet.Remove(entity);
- return dbContext.SaveChangesAsync(token);
+ var entry = dbSet.Remove(entity);
+ var affected = dbContext.SaveChangesAsync(token);
+ entry.State = EntityState.Detached;
+ return affected;
}
protected virtual TDto Convert(TEntity src) => src.Adapt();
diff --git a/AsbCloudWebApi.Tests/ServicesTests/CrudServiceTest.cs b/AsbCloudWebApi.Tests/ServicesTests/CrudServiceTestAbstract.cs
similarity index 64%
rename from AsbCloudWebApi.Tests/ServicesTests/CrudServiceTest.cs
rename to AsbCloudWebApi.Tests/ServicesTests/CrudServiceTestAbstract.cs
index 0b94eaf1..043af57f 100644
--- a/AsbCloudWebApi.Tests/ServicesTests/CrudServiceTest.cs
+++ b/AsbCloudWebApi.Tests/ServicesTests/CrudServiceTestAbstract.cs
@@ -1,7 +1,5 @@
-using AsbCloudApp.Data;
-using AsbCloudApp.Services;
-using AsbCloudDb.Model;
-using AsbCloudInfrastructure.Services;
+using AsbCloudApp.Services;
+using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
@@ -9,27 +7,6 @@ using Xunit;
namespace AsbCloudWebApi.Tests.ServicesTests
{
- public class DepositCrudServiceTest : CrudServiceTestAbstract
- {
- protected override DepositDto MakeNewItem()
- {
- var item = new DepositDto
- {
- Caption = "test deposit",
- Latitude = 1,
- Longitude = 2,
- Timezone = new SimpleTimezoneDto { Hours = 5, TimezoneId = "test Never-land"}
- };
- return item;
- }
-
- protected override ICrudService MakeService()
- {
- var dbContext = TestHelpter.MakeTestContext();
- return new CrudCacheServiceBase(dbContext);
- }
- }
-
public abstract class CrudServiceTestAbstract
where TDto: AsbCloudApp.Data.IId
{
@@ -37,6 +14,7 @@ namespace AsbCloudWebApi.Tests.ServicesTests
public CrudServiceTestAbstract()
{
+ AsbCloudInfrastructure.DependencyInjection.MapsterSetup();
service = MakeService();
}
@@ -44,11 +22,12 @@ namespace AsbCloudWebApi.Tests.ServicesTests
protected abstract TDto MakeNewItem();
[Fact]
- public async Task Insert()
+ public async Task Insert()
{
var newItem = MakeNewItem();
var id = await service.InsertAsync(newItem, CancellationToken.None);
Assert.True(id > 0);
+ return id;
}
[Fact]
@@ -64,8 +43,7 @@ namespace AsbCloudWebApi.Tests.ServicesTests
[Fact]
public async Task GetById()
{
- var newItem = MakeNewItem();
- var id = await service.InsertAsync(newItem, CancellationToken.None);
+ var id = await Insert();
var gotItem = await service.GetAsync(id, CancellationToken.None);
Assert.True(id > 0);
Assert.Equal(id, gotItem.Id);
@@ -83,14 +61,25 @@ namespace AsbCloudWebApi.Tests.ServicesTests
Assert.Equal(count + 1, newCount);
}
+ [Fact]
+ public async Task UpdateAsync_returns_notfound()
+ {
+ var item = MakeNewItem();
+ item.Id = int.MaxValue - 1;
+ var updatedId = await service.UpdateAsync(item, CancellationToken.None);
+ Assert.True(updatedId < 0);
+ }
+
[Fact]
public async Task UpdateAsync()
{
var newItem = MakeNewItem();
- var id = await service.InsertAsync(newItem, CancellationToken.None);
- var updatedId = await service.UpdateAsync(newItem, CancellationToken.None);
- Assert.True(id > 0);
- Assert.Equal(id, updatedId);
+ newItem.Id = await service.InsertAsync(newItem, CancellationToken.None);
+ var item = MakeNewItem();
+ item.Id = newItem.Id;
+ var updatedId = await service.UpdateAsync(item, CancellationToken.None);
+ Assert.True(newItem.Id > 0);
+ Assert.Equal(newItem.Id, updatedId);
}
[Fact]
diff --git a/AsbCloudWebApi.Tests/ServicesTests/DepositCrudCacheServiceTest.cs b/AsbCloudWebApi.Tests/ServicesTests/DepositCrudCacheServiceTest.cs
new file mode 100644
index 00000000..d7769352
--- /dev/null
+++ b/AsbCloudWebApi.Tests/ServicesTests/DepositCrudCacheServiceTest.cs
@@ -0,0 +1,28 @@
+using AsbCloudApp.Data;
+using AsbCloudApp.Services;
+using AsbCloudDb.Model;
+using AsbCloudInfrastructure.Services;
+
+namespace AsbCloudWebApi.Tests.ServicesTests
+{
+ public class DepositCrudCacheServiceTest : CrudServiceTestAbstract
+ {
+ protected override DepositDto MakeNewItem()
+ {
+ var item = new DepositDto
+ {
+ Caption = "test deposit",
+ Latitude = 1,
+ Longitude = 2,
+ Timezone = new SimpleTimezoneDto { Hours = 5, TimezoneId = "test Never-land"}
+ };
+ return item;
+ }
+
+ protected override ICrudService MakeService()
+ {
+ var dbContext = TestHelpter.MakeTestContext();
+ return new CrudCacheServiceBase(dbContext);
+ }
+ }
+}