2015-06-12 2 views
0

Мое требование состоит в том, что мне нужно удалить некоторые строки из таблицы, а затем вставить их в одну и ту же таблицу. Я использую Единицу работы, и поэтому удаление и вставка являются частью одной транзакции. Но когда я пытаюсь сохранить данные, инфраструктура сущности - это ошибка дублирования ключевого ключа. Пожалуйста, найти ниже примера и код:удаление, а затем вставка значений с использованием структуры Entity

пример: Таблица Name- Таблица1, Столбцы - col1 (ск), col2 (СК), col3

строки к Удалить- 78,1,1

RowTo Добавить- 78,1,1 78,2,2

Моя Единица работы класс:

public class DataRepository<T> : IRepository<T> where T:class // IDisposable, 
 
    { 
 
     #region Variables 
 

 
     private readonly CWSEntities _context; 
 
     protected readonly IDbSet<T> _dbset; 
 

 
     #endregion 
 

 
     #region Constructors 
 

 
     public DataRepository() 
 
     { 
 
      _context = new CWSEntities(); 
 
      _dbset = _context.Set<T>(); 
 

 
     } 
 
     public DataRepository(CWSEntities context) 
 
     { 
 
      _context =context; 
 
      _dbset = _context.Set<T>(); 
 

 
     } 
 

 
     #endregion 
 

 
     #region Methods 
 

 
     public IQueryable<T> All() 
 
     { 
 
      return _context.Set<T>(); 
 
     } 
 

 
     // public IQueryable<T> AllInclude(params Expression<Func<T,object>>[] include) 
 
     public IQueryable<T> Include(params Expression<Func<T, object>>[] include) 
 
     { 
 
      IQueryable<T> retValue = _context.Set<T>(); 
 

 
      foreach (var item in include) 
 
      { 
 
       retValue = retValue.Include(item); 
 
      } 
 
      return retValue; 
 
     } 
 

 
     public T GetById(object id) 
 
     { 
 
      return this._dbset.Find(id); 
 
     }  
 

 
     public IEnumerable<T> Get(Expression<Func<T, bool>> filter = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, 
 
      string includeProperties = "") 
 
     { 
 
      IQueryable<T> query = _dbset; 
 

 
      if (filter != null) 
 
      { 
 
       query = query.Where(filter); 
 
      } 
 

 
      foreach (var includeProperty in includeProperties.Split 
 
       (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) 
 
      { 
 
       query = query.Include(includeProperty); 
 
      } 
 

 
      if (orderBy != null) 
 
      { 
 
       return orderBy(query).ToList(); 
 
      } 
 
      else 
 
      { 
 
       return query.ToList(); 
 
      } 
 
     } 
 

 
     public T Add(T entity) 
 
     { 
 
      if (entity != null) 
 
      { 
 
       return _dbset.Add(entity); 
 
      } 
 
      return null; 
 
     } 
 

 
     public void Delete(object id) 
 
     { 
 
      T entityToDelete = _dbset.Find(id); 
 
         
 
      Delete(id); 
 
     } 
 

 
     public void Delete(T entityToDelete) 
 
     { 
 
      if (entityToDelete != null) 
 
      { 
 
       if (_context.Entry(entityToDelete).State == EntityState.Detached) 
 
       { 
 
        _dbset.Attach(entityToDelete); 
 
       } 
 
       _dbset.Remove(entityToDelete); 
 
      } 
 
      
 
     } 
 

 
     public void Update(T entityToUpdate) 
 
     { 
 
      if (entityToUpdate != null) 
 
      { 
 
       _dbset.Attach(entityToUpdate); 
 
       _context.Entry(entityToUpdate).State = EntityState.Modified; 
 
       // _context.Entry(entity).State = System.Data.Entity.EntityState.Modified; 
 
      } 
 
     } 
 

 
     public virtual void Save() 
 
     { 
 
      try 
 
      { 
 
       _context.SaveChanges(); 
 
      } 
 
      catch(DbEntityValidationException exception) 
 
      { 
 

 
      } 
 
     }

+0

Вы экономите время на удаление и обновление? – artm

+0

Можете ли вы разместить код, который вызывает ваш репозиторий? – user2697817

ответ

1

Из того, что я могу собрать вы пытаетесь добавить объекты с таким же первичным ключом, как вы сказали, в вашем примере

RowTo Добавить- 78,1,1 78,2,2

Неправильно выглядит ваш метод Add. Вы можете сначала проверить, существует ли сущность, передав значения первичного ключа для объекта, а если нет, то добавьте, если это не возможно обновление?

public T Add(T entity, params object[] keys) 
{ 
    if (entity != null) 
    { 
     var existing = _dbset.Find(keys) 
     if (existing == null) 
      return _dbset.Add(entity); 
     else 
      Update(entity); 
    } 
    return null; 
} 
Смежные вопросы