2013-05-19 27 views
1

您好我试着写了删除操作的通用信息库,这是我的仓库如何通过DbSet删除的EntityFramework

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); 
     } 
} 

当我打电话通过这样

public void RemoveContact(ContactViewModel contactViewModel) 
     { 
      var categoryView = new ContactViewModel { ContactId = contactViewModel.ContactId }; 
      var contact = categoryView.ConvertToContactModel(); 
      _contactRepository.Delete(contact); 
      _contactRepository.SaveChanges(); 
     } 
服务方法删除

它不起作用,因为它没有找到实体 我该如何编写mt通用资源库中的删除方法?

+0

首先提取实体,然后将其删除。 – VikciaR

+0

我该怎么做? –

+0

http://msdn.microsoft.com/en-us/library/system.data.entity.dbset.find%28v=vs.103%29.aspx – VikciaR

回答

2

问题是您的实体尚未附加。

我的继承人通用库,看看我是如何做到这一点

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

+0

谢谢,现在我得到了这个错误存储更新,插入或删除语句影响了意外数量的行(0)。自实体加载后,实体可能已被修改或删除。刷新ObjectStateManager条目。现在有什么问题? –

+0

这是并发问题。另一个进程删除对象 –

+0

或者您有多个上下文在播放...针对并发问题的陷阱 –

1

,如果你与断开连接的实体的工作,你是确保实体没有上下文跟踪(你应该),你可以写这个简单的代码。

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。什么样的价值取决于你的策略。在这里,我假设你正在实施“最后记录胜利”策略