.NET Core, случайное создание дублирующихся записей - PullRequest
2 голосов
/ 03 апреля 2019

У меня есть веб-приложение с кодом, созданное с использованием Entity Framework Core и ASP.NET Core 2.1.Когда я сохраняю данные, иногда они сохраняются правильно только с 1 записью.Однако иногда он сохраняет 2 дублированных записи с разными идентификаторами.

Метод Create(company) вызывается только один раз из контроллера, но иногда создает две компании.

Реализация контроллера:

[ApiController]
public class CompaniesController : ControllerBase
{
   private readonly ICompanyManager _companyManager;

   public CompaniesController(IEmpresaManager companyManager)
   {
       _companyManager = companyManager;
   } 

   [HttpPost]
   public async Task<IActionResult> Post(CompanyBindingModel companyViewModel)
   {
       try
       {
           await _companyManager.Create(_mapper.Map<Company>(companyViewModel));
       }
       catch (Exception ex)
       {
          return Conflict(ex.Message);
       }

       return Ok(new { Mensagem = "Company created successfully" });
   }

Реализация менеджера:

public class CompanyManager : ICompanyManager 
{
   private readonly RepositoyBase<Company, long> _repository;

   public CompanyManager (RepositoyBase<Company, long> repository) {
      _repository = repository;
   }

   public async Task<long> Create(Company company)
   {
      _repository.Add(company);
      await _repository.SaveChangesAsync();
      return company.Id;
   }
}

Это моя реализация шаблона репозитория, которая сохраняет все сущности.DbContext внедряется через внедрение зависимостей и регистрируется как область действия.

In Startup.cs

services.AddScoped<DbContext, ApplicationDbContext>();

Реализация репозитория

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;

namespace MyProject.Repositories
{
    public class RepositoryBase<TEntity, TKey> : IRepositoryBase<TEntity, TKey>
        where TEntity : class, IEntity<TKey>
        where TKey : struct
    {
        protected readonly DbContext _dbContext;

        public RepositoryBase(DbContext dbContext)
        {
            _dbContext = dbContext;
        }

        public virtual async Task<IEnumerable<TEntity>> GetAll(Expression<Func<TEntity, bool>> expression)
        {
            return await _dbContext.Set<TEntity>().Where(expression).ToListAsync();
        }

        public virtual async Task<TEntity> Get(Expression<Func<TEntity, bool>> expression)
        {
            return await _dbContext.Set<TEntity>().FindAsync(expression);
        }

        public virtual async Task<TEntity> GetById(TKey id)
        {
            return await _dbContext.Set<TEntity>().FindAsync(id);
        }

        public virtual IQueryable<TEntity> GetAll()
        {
            return _dbContext.Set<TEntity>().AsNoTracking();
        }

        public virtual void Add(TEntity entity)
        {
            _dbContext.Set<TEntity>().Add(entity);
        }

        public virtual void Update(TEntity entity)
        {
            _dbContext.Set<TEntity>().Update(entity);
        }

        public virtual void Remove(TEntity entity)
        {
            if (_dbContext.Entry(entity).State == EntityState.Detached)
            {
                _dbContext.Attach(entity);
            }

            _dbContext.Set<TEntity>().Remove(entity);
        }

        public virtual void Remove(TKey id)
        {
            TEntity entityToRemove = _dbContext.Set<TEntity>().Find(id);

            _dbContext.Set<TEntity>().Remove(entityToRemove);
        }

        public virtual async Task SaveChangesAsync()
        {
            await _dbContext.SaveChangesAsync();
        }
    }
}

Это вызвано моей реализацией репозитория, DbContextзарегистрирован как область действия или что-то с потокобезопасностью?

...