From 643a5b72805e52bf005242669048d92dfb0421e2 Mon Sep 17 00:00:00 2001 From: Glliza Date: Tue, 11 Mar 2025 22:44:23 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9A=D0=BE=D0=BD=D1=82=D1=80=D0=B0=D0=BA?= =?UTF-8?q?=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Exceptions/ElementDeletedException.cs | 13 ++ .../IProductStorageContract.cs | 3 +- .../Implementations/BuyerStorageContract.cs | 5 +- .../Implementations/PointsStorageContract.cs | 62 ++++++ .../Implementations/PostStorageContract.cs | 203 ++++++++++++++++++ .../Implementations/ProductStorageContract.cs | 183 ++++++++++++++++ .../Implementations/SaleStorageContract.cs | 120 +++++++++++ .../Implementations/WorkerStorageContract.cs | 152 +++++++++++++ .../PuferFishDataBase.csproj | 1 + 9 files changed, 738 insertions(+), 4 deletions(-) create mode 100644 PuferFishContracts/PuferFishContracts/Exceptions/ElementDeletedException.cs create mode 100644 PuferFishContracts/PuferFishDataBase/Implementations/PointsStorageContract.cs create mode 100644 PuferFishContracts/PuferFishDataBase/Implementations/PostStorageContract.cs create mode 100644 PuferFishContracts/PuferFishDataBase/Implementations/ProductStorageContract.cs create mode 100644 PuferFishContracts/PuferFishDataBase/Implementations/SaleStorageContract.cs create mode 100644 PuferFishContracts/PuferFishDataBase/Implementations/WorkerStorageContract.cs diff --git a/PuferFishContracts/PuferFishContracts/Exceptions/ElementDeletedException.cs b/PuferFishContracts/PuferFishContracts/Exceptions/ElementDeletedException.cs new file mode 100644 index 0000000..b1e004a --- /dev/null +++ b/PuferFishContracts/PuferFishContracts/Exceptions/ElementDeletedException.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PuferFishContracts.Exceptions +{ + public class ElementDeletedException : Exception + { + public ElementDeletedException(string id) : base($"Cannot modify a deleted item(id: { id})") { } + } +} diff --git a/PuferFishContracts/PuferFishContracts/StoragesContracts/IProductStorageContract.cs b/PuferFishContracts/PuferFishContracts/StoragesContracts/IProductStorageContract.cs index 86c4773..a5999ee 100644 --- a/PuferFishContracts/PuferFishContracts/StoragesContracts/IProductStorageContract.cs +++ b/PuferFishContracts/PuferFishContracts/StoragesContracts/IProductStorageContract.cs @@ -9,8 +9,7 @@ namespace PuferFishContracts.StoragesContracts; public interface IProductStorageContract { - List GetList(bool onlyActive = true, string? -manufacturerId = null); + List GetList(bool onlyActive = true); List GetHistoryByProductId(string productId); ProductDataModel? GetElementById(string id); ProductDataModel? GetElementByName(string name); diff --git a/PuferFishContracts/PuferFishDataBase/Implementations/BuyerStorageContract.cs b/PuferFishContracts/PuferFishDataBase/Implementations/BuyerStorageContract.cs index 4ada920..f71ed61 100644 --- a/PuferFishContracts/PuferFishDataBase/Implementations/BuyerStorageContract.cs +++ b/PuferFishContracts/PuferFishDataBase/Implementations/BuyerStorageContract.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using AutoMapper; using Microsoft.EntityFrameworkCore; using Npgsql; using PuferFishContracts.DataModels; @@ -14,9 +15,9 @@ namespace PuferFishDataBase.Implementations; internal class BuyerStorageContract : IBuyerStorageContract { - private readonly CatHasPawsDbContext _dbContext; + private readonly PuferFishDbContext _dbContext; private readonly Mapper _mapper; - public BuyerStorageContract(CatHasPawsDbContext dbContext) + public BuyerStorageContract(PuferFishDbContext dbContext) { _dbContext = dbContext; var config = new MapperConfiguration(cfg => diff --git a/PuferFishContracts/PuferFishDataBase/Implementations/PointsStorageContract.cs b/PuferFishContracts/PuferFishDataBase/Implementations/PointsStorageContract.cs new file mode 100644 index 0000000..6ce2183 --- /dev/null +++ b/PuferFishContracts/PuferFishDataBase/Implementations/PointsStorageContract.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AutoMapper; +using PuferFishContracts.DataModels; +using PuferFishContracts.Exceptions; +using PuferFishContracts.StoragesContracts; +using PuferFishDataBase.Models; + +namespace PuferFishDataBase.Implementations; + +internal class PointsStorageContract : IPointsStorageContract +{ + private readonly PuferFishDbContext _dbContext; + private readonly Mapper _mapper; + + public PointsStorageContract(PuferFishDbContext dbContext) + { + _dbContext = dbContext; + var config = new MapperConfiguration(cfg => + { + cfg.CreateMap(); + cfg.CreateMap() + .ForMember(dest => dest.BuyerPoints, opt => + opt.MapFrom(src => src.Points)); + }); + _mapper = new Mapper(config); + } + public List GetList(DateTime startDate, DateTime endDate, string? buyerId = null) + { + try + { + var query = _dbContext.Pointss.Where(x => x.PointsDate >= + startDate && x.PointsDate <= endDate); + if (buyerId is not null) + { + query = query.Where(x => x.BuyerId == buyerId); + } + return [.. query.Select(x => _mapper.Map(x))]; + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + public void AddElement(PointsDataModel salaryDataModel) + { + try + { + _dbContext.Pointss.Add(_mapper.Map(salaryDataModel)); + _dbContext.SaveChanges(); + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } +} diff --git a/PuferFishContracts/PuferFishDataBase/Implementations/PostStorageContract.cs b/PuferFishContracts/PuferFishDataBase/Implementations/PostStorageContract.cs new file mode 100644 index 0000000..ddf8c37 --- /dev/null +++ b/PuferFishContracts/PuferFishDataBase/Implementations/PostStorageContract.cs @@ -0,0 +1,203 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AutoMapper; +using Microsoft.EntityFrameworkCore; +using Npgsql; +using PuferFishContracts.DataModels; +using PuferFishContracts.Exceptions; +using PuferFishContracts.StoragesContracts; +using PuferFishDataBase.Models; + +namespace PuferFishDataBase.Implementations; + +internal class PostStorageContract : IPostStorageContract +{ + private readonly PuferFishDbContext _dbContext; + private readonly Mapper _mapper; + public PostStorageContract(PuferFishDbContext dbContext) + { + _dbContext = dbContext; + var config = new MapperConfiguration(cfg => + { + cfg.CreateMap() + .ForMember(x => x.Id, x => x.MapFrom(src => + src.PostId)); + cfg.CreateMap() + .ForMember(x => x.Id, x => x.Ignore()) + .ForMember(x => x.PostId, x => x.MapFrom(src => src.Id)) + .ForMember(x => x.IsActual, x => x.MapFrom(src => true)) + .ForMember(x => x.ChangeDate, x => x.MapFrom(src => + DateTime.UtcNow)); + }); + _mapper = new Mapper(config); + } + + public List GetList(bool onlyActual = true) + { + try + { + var query = _dbContext.Posts.AsQueryable(); + if (onlyActual) + { + query = query.Where(x => x.IsActual); + } + return [.. query.Select(x => _mapper.Map(x))]; + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + + public List GetPostWithHistory(string postId) + { + try + { + return [.. _dbContext.Posts.Where(x => x.PostId == postId).Select(x => _mapper.Map(x))]; + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + public PostDataModel? GetElementById(string id) + { + try + { + return + _mapper.Map(_dbContext.Posts.FirstOrDefault(x => x.PostId == id && + x.IsActual)); + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + public PostDataModel? GetElementByName(string name) + { + try + { + return + _mapper.Map(_dbContext.Posts.FirstOrDefault(x => x.PostName == + name && x.IsActual)); + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + public void AddElement(PostDataModel postDataModel) + { + try + { + _dbContext.Posts.Add(_mapper.Map(postDataModel)); + _dbContext.SaveChanges(); + } + catch (DbUpdateException ex) when (ex.InnerException is + PostgresException { ConstraintName: "IX_Posts_PostName_IsActual" }) + { + _dbContext.ChangeTracker.Clear(); + throw new ElementExistsException("PostName", + postDataModel.PostName); + } + catch (DbUpdateException ex) when (ex.InnerException is + PostgresException { ConstraintName: "IX_Posts_PostId_IsActual" }) + { + _dbContext.ChangeTracker.Clear(); + throw new ElementExistsException("PostId", postDataModel.Id); + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + public void UpdElement(PostDataModel postDataModel) + { + try + { + var transaction = _dbContext.Database.BeginTransaction(); + try + { + var element = GetPostById(postDataModel.Id) ?? throw new + ElementNotFoundException(postDataModel.Id); + if (!element.IsActual) + { + throw new ElementDeletedException(postDataModel.Id); + } + element.IsActual = false; + _dbContext.SaveChanges(); + var newElement = _mapper.Map(postDataModel); + _dbContext.Posts.Add(newElement); + _dbContext.SaveChanges(); + transaction.Commit(); + } + catch + { + transaction.Rollback(); + throw; + } + } + catch (DbUpdateException ex) when (ex.InnerException is + PostgresException { ConstraintName: "IX_Posts_PostName_IsActual" }) + { + _dbContext.ChangeTracker.Clear(); + throw new ElementExistsException("PostName", + postDataModel.PostName); + } + catch (Exception ex) when (ex is ElementDeletedException || ex is + ElementNotFoundException) + { + _dbContext.ChangeTracker.Clear(); + throw; + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + public void DelElement(string id) + { + try + { + var element = GetPostById(id) ?? throw new + ElementNotFoundException(id); + if (!element.IsActual) + { + throw new ElementDeletedException(id); + } + element.IsActual = false; + _dbContext.SaveChanges(); + } + catch + { + _dbContext.ChangeTracker.Clear(); + throw; + } + } + public void ResElement(string id) + { + try + { + var element = GetPostById(id) ?? throw new + ElementNotFoundException(id); + element.IsActual = true; + _dbContext.SaveChanges(); + } + catch + { + _dbContext.ChangeTracker.Clear(); + throw; + } + } + private Post? GetPostById(string id) => _dbContext.Posts.Where(x => + x.PostId == id).OrderByDescending(x => x.ChangeDate).FirstOrDefault(); +} \ No newline at end of file diff --git a/PuferFishContracts/PuferFishDataBase/Implementations/ProductStorageContract.cs b/PuferFishContracts/PuferFishDataBase/Implementations/ProductStorageContract.cs new file mode 100644 index 0000000..4ef7d6e --- /dev/null +++ b/PuferFishContracts/PuferFishDataBase/Implementations/ProductStorageContract.cs @@ -0,0 +1,183 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AutoMapper; +using Microsoft.EntityFrameworkCore; +using Npgsql; +using PuferFishContracts.DataModels; +using PuferFishContracts.Exceptions; +using PuferFishContracts.StoragesContracts; +using PuferFishDataBase.Models; + +namespace PuferFishDataBase.Implementations; + +internal class ProductStorageContract : IProductStorageContract +{ + private readonly PuferFishDbContext _dbContext; + private readonly Mapper _mapper; + public ProductStorageContract(PuferFishDbContext dbContext) + { + _dbContext = dbContext; + var config = new MapperConfiguration(cfg => + { + cfg.CreateMap(); + cfg.CreateMap() + .ForMember(x => x.IsDeleted, x => x.MapFrom(src => + false)); + cfg.CreateMap(); + }); + _mapper = new Mapper(config); + } + public List GetList(bool onlyActive = true) + { + try + { + var query = _dbContext.Products.AsQueryable(); + if (onlyActive) + { + query = query.Where(x => !x.IsDeleted); + } + return [.. query.Select(x => _mapper.Map(x))]; + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + public List GetHistoryByProductId(string + productId) + { + try + { + return [.. _dbContext.ProductHistories.Where(x => x.ProductId +== productId).OrderByDescending(x => x.ChangeDate).Select(x => _mapper.Map(x))]; + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + public ProductDataModel? GetElementById(string id) + { + try + { + return _mapper.Map(GetProductById(id)); + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + public ProductDataModel? GetElementByName(string name) + { + try + { + return + _mapper.Map(_dbContext.Products.FirstOrDefault(x => x.ProductName == name && !x.IsDeleted)); + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + public void AddElement(ProductDataModel productDataModel) + { + try + { + _dbContext.Products.Add(_mapper.Map(productDataModel)); + _dbContext.SaveChanges(); + } + catch (InvalidOperationException ex) when (ex.TargetSite?.Name == + "ThrowIdentityConflict") + { + _dbContext.ChangeTracker.Clear(); + throw new ElementExistsException("Id", productDataModel.Id); + } + catch (DbUpdateException ex) when (ex.InnerException is + PostgresException { ConstraintName: "IX_Products_ProductName_IsDeleted" }) + { + _dbContext.ChangeTracker.Clear(); + throw new ElementExistsException("ProductName", + productDataModel.ProductName); + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + public void UpdElement(ProductDataModel productDataModel) + { + try + { + var transaction = _dbContext.Database.BeginTransaction(); + try + { + var element = GetProductById(productDataModel.Id) ?? + throw new ElementNotFoundException(productDataModel.Id); + if (element.Price != productDataModel.Price) + { + _dbContext.ProductHistories.Add(new + ProductHistory() + { ProductId = element.Id, OldPrice = element.Price }); + _dbContext.SaveChanges(); + } + _dbContext.Products.Update(_mapper.Map(productDataModel, + element)); + _dbContext.SaveChanges(); + transaction.Commit(); + } + catch + { + transaction.Rollback(); + throw; + } + } + catch (DbUpdateException ex) when (ex.InnerException is + PostgresException { ConstraintName: "IX_Products_ProductName_IsDeleted" }) + { + _dbContext.ChangeTracker.Clear(); + throw new ElementExistsException("ProductName", + productDataModel.ProductName); + } + catch (Exception ex) when (ex is ElementDeletedException || ex is + ElementNotFoundException) + { + _dbContext.ChangeTracker.Clear(); + throw; + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + public void DelElement(string id) + { + try + { + var element = GetProductById(id) ?? throw new + ElementNotFoundException(id); + element.IsDeleted = true; + _dbContext.SaveChanges(); + } + catch (ElementNotFoundException ex) + { + _dbContext.ChangeTracker.Clear(); + throw; + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + private Product? GetProductById(string id) => + _dbContext.Products.FirstOrDefault(x => x.Id == id && !x.IsDeleted); +} diff --git a/PuferFishContracts/PuferFishDataBase/Implementations/SaleStorageContract.cs b/PuferFishContracts/PuferFishDataBase/Implementations/SaleStorageContract.cs new file mode 100644 index 0000000..d03520e --- /dev/null +++ b/PuferFishContracts/PuferFishDataBase/Implementations/SaleStorageContract.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AutoMapper; +using Microsoft.EntityFrameworkCore; +using PuferFishContracts.DataModels; +using PuferFishContracts.Exceptions; +using PuferFishContracts.StoragesContracts; +using PuferFishDataBase.Models; + +namespace PuferFishDataBase.Implementations; + +internal class SaleStorageContract : ISaleStorageContract +{ + private readonly PuferFishDbContext _dbContext; + private readonly Mapper _mapper; + public SaleStorageContract(PuferFishDbContext dbContext) + { + _dbContext = dbContext; + var config = new MapperConfiguration(cfg => + { + cfg.CreateMap(); + cfg.CreateMap(); + cfg.CreateMap(); + cfg.CreateMap() + .ForMember(x => x.IsCancel, x => x.MapFrom(src => + false)) + .ForMember(x => x.SaleProducts, x => x.MapFrom(src => + src.Products)); + }); + _mapper = new Mapper(config); + } + public List GetList(DateTime? startDate = null, DateTime? endDate = null, string? workerId = null, + string? buyerId = null, string? productId = null) + { + try + { + var query = _dbContext.Sales.Include(x => + x.SaleProducts).AsQueryable(); + if (startDate is not null && endDate is not null) + { + query = query.Where(x => x.SaleDate >= startDate && + x.SaleDate < endDate); + } + if (workerId is not null) + { + query = query.Where(x => x.WorkerId == workerId); + } + if (buyerId is not null) + { + query = query.Where(x => x.BuyerId == buyerId); + } + if (productId is not null) + { + query = query.Where(x => x.SaleProducts!.Any(y => + y.ProductId == productId)); + } + return [.. query.Select(x => _mapper.Map(x))]; + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + public SaleDataModel? GetElementById(string id) + { + try + { + return _mapper.Map(GetSaleById(id)); + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + public void AddElement(SaleDataModel saleDataModel) + { + try + { + _dbContext.Sales.Add(_mapper.Map(saleDataModel)); + _dbContext.SaveChanges(); + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + public void DelElement(string id) + { + try + { + var element = GetSaleById(id) ?? throw new + ElementNotFoundException(id); + if (element.IsCancel) + { + throw new ElementDeletedException(id); + } + element.IsCancel = true; + _dbContext.SaveChanges(); + } + catch (Exception ex) when (ex is ElementDeletedException || ex is + ElementNotFoundException) + { + _dbContext.ChangeTracker.Clear(); + throw; + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + private Sale? GetSaleById(string id) => _dbContext.Sales.FirstOrDefault(x + => x.Id == id); +} diff --git a/PuferFishContracts/PuferFishDataBase/Implementations/WorkerStorageContract.cs b/PuferFishContracts/PuferFishDataBase/Implementations/WorkerStorageContract.cs new file mode 100644 index 0000000..1832f03 --- /dev/null +++ b/PuferFishContracts/PuferFishDataBase/Implementations/WorkerStorageContract.cs @@ -0,0 +1,152 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AutoMapper; +using PuferFishContracts.DataModels; +using PuferFishContracts.Exceptions; +using PuferFishContracts.StoragesContracts; +using PuferFishDataBase.Models; + +namespace PuferFishDataBase.Implementations; + +internal class WorkerStorageContract : IWorkerStorageContract +{ + private readonly PuferFishDbContext _dbContext; + private readonly Mapper _mapper; + + public WorkerStorageContract(PuferFishDbContext dbContext) + { + _dbContext = dbContext; + var config = new MapperConfiguration(cfg => + { + cfg.CreateMap(); + cfg.CreateMap(); + }); + _mapper = new Mapper(config); + } + public List GetList(bool onlyActive = true, string? postId + = null, DateTime? fromBirthDate = null, DateTime? toBirthDate = null, DateTime? + fromEmploymentDate = null, DateTime? toEmploymentDate = null) + { + try + { + var query = _dbContext.Workers.AsQueryable(); + if (onlyActive) + { + query = query.Where(x => !x.IsDeleted); + } + if (postId is not null) + { + query = query.Where(x => x.PostId == postId); + } + if (fromBirthDate is not null && toBirthDate is not null) + { + query = query.Where(x => x.BirthDate >= fromBirthDate && + x.BirthDate <= toBirthDate); + } + if (fromEmploymentDate is not null && toEmploymentDate is not + null) + { + query = query.Where(x => x.EmploymentDate >= + fromEmploymentDate && x.EmploymentDate <= toEmploymentDate); + } + return [.. query.Select(x => _mapper.Map(x))]; + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + public WorkerDataModel? GetElementById(string id) + { + try + { + return _mapper.Map(GetWorkerById(id)); + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + public WorkerDataModel? GetElementByFIO(string fio) + { + try + { + return + _mapper.Map(_dbContext.Workers.FirstOrDefault(x => x.FIO == + fio)); + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + public void AddElement(WorkerDataModel workerDataModel) + { + try + { + _dbContext.Workers.Add(_mapper.Map(workerDataModel)); + _dbContext.SaveChanges(); + } + catch (InvalidOperationException ex) when (ex.TargetSite?.Name == + "ThrowIdentityConflict") + { + _dbContext.ChangeTracker.Clear(); + throw new ElementExistsException("Id", workerDataModel.Id); + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + public void UpdElement(WorkerDataModel workerDataModel) + { + try + { + var element = GetWorkerById(workerDataModel.Id) ?? throw new + ElementNotFoundException(workerDataModel.Id); + _dbContext.Workers.Update(_mapper.Map(workerDataModel, + element)); + _dbContext.SaveChanges(); + } + catch (ElementNotFoundException) + { + _dbContext.ChangeTracker.Clear(); + throw; + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + public void DelElement(string id) + { + try + { + var element = GetWorkerById(id) ?? throw new + ElementNotFoundException(id); + element.IsDeleted = true; + _dbContext.SaveChanges(); + } + catch (ElementNotFoundException) + { + _dbContext.ChangeTracker.Clear(); + throw; + } + catch (Exception ex) + { + _dbContext.ChangeTracker.Clear(); + throw new StorageException(ex); + } + } + private Worker? GetWorkerById(string id) => + _dbContext.Workers.FirstOrDefault(x => x.Id == id && !x.IsDeleted); + +} diff --git a/PuferFishContracts/PuferFishDataBase/PuferFishDataBase.csproj b/PuferFishContracts/PuferFishDataBase/PuferFishDataBase.csproj index d38afa4..2dea64a 100644 --- a/PuferFishContracts/PuferFishDataBase/PuferFishDataBase.csproj +++ b/PuferFishContracts/PuferFishDataBase/PuferFishDataBase.csproj @@ -7,6 +7,7 @@ +