如何在EntityFramework中通过DbSet删除



嗨,我想写一个通用的存储库删除操作,这是我的存储库

public class Repository<T> : IRepository<T> where T : class, IAggregateRoot
    {
        private readonly DbSet<T> _entitySet;
        private readonly StatosContext _statosContext;
  public Repository(StatosContext statosContext)
        {
            _statosContext = statosContext;
            _entitySet = statosContext.Set<T>();
        }
 public void Add(T entity)
        {
            _entitySet.Add(entity);
        }
  public void Delete(T entity)
        {
            _entitySet.Remove(entity);
        }
}

当我通过这样的服务方法调用Delete

public void RemoveContact(ContactViewModel contactViewModel)
        {
            var categoryView = new ContactViewModel { ContactId = contactViewModel.ContactId };
            var contact = categoryView.ConvertToContactModel();
            _contactRepository.Delete(contact);
            _contactRepository.SaveChanges();
        }

它不起作用,因为它没有找到实体我如何在mt通用存储库中编写Delete方法??

问题是你的实体还没有被附加。

这是我的通用存储库,看看我是怎么做的

    public void RemoveOnSave(T entity)
    {
        try
        {
            var e = m_Context.Entry(entity);
            if (e.State == EntityState.Detached)
            {
                m_Context.Set<T>().Attach(entity);
                e = m_Context.Entry(entity);
            }
            e.State = EntityState.Deleted;
        }
        catch (InvalidOperationException ex)
        {
            throw new RepositoryTrackingException(
                "An attempt was made to delete an entity you are already modifying, this may happen if you are trying to update using the same repository instance in two place", ex);
        }
    }
https://github.com/lukemcgregor/StaticVoid.Repository/blob/master/StaticVoid.Repository.EntityFramework/DbContextRepositoryDataSource.cs

如果您正在处理断开连接的实体,并且您确定实体不被上下文跟踪(您应该),您可以编写以下简单代码:

public void Delete(T entity)
    {
        try
        {
             _entitySet.Attach(entity);
             _entitySet.Remove(entity);
             _statosContext.SaveChanges();
        }
        catch (OptimisticConcurrencyException e)
        {
             _statosContext.Refresh(RefreshMode.ClientWins,entity);
        }
    }

RefreshMode有两个可能的值:ClientWins和StoreWins。选择什么值取决于你的策略。这里我假设你正在执行"Last Record Wins"策略

最新更新