Entity framework 使用实体框架删除然后插入值
我的要求是,我需要从表中删除一些行,然后在同一个表中插入一些行。我使用的是工作单元,因此删除和插入都是同一事务的一部分。但当我试图保存数据时,实体框架出现了重复键抛出错误。请在下面查找示例和代码: 示例:表名-表1,列-col1(c.K)、col2(c.K)、col3 要删除的行-78,1,1 要添加的行-78,1,1 78,2,2 我的工作单元是:Entity framework 使用实体框架删除然后插入值,entity-framework,unit-of-work,Entity Framework,Unit Of Work,我的要求是,我需要从表中删除一些行,然后在同一个表中插入一些行。我使用的是工作单元,因此删除和插入都是同一事务的一部分。但当我试图保存数据时,实体框架出现了重复键抛出错误。请在下面查找示例和代码: 示例:表名-表1,列-col1(c.K)、col2(c.K)、col3 要删除的行-78,1,1 要添加的行-78,1,1 78,2,2 我的工作单元是: 公共类数据存储库:IRepository,其中T:class//IDisposable, { #区域变量 私有只读CWU上下文; 受保护的只读I
公共类数据存储库:IRepository,其中T:class//IDisposable,
{
#区域变量
私有只读CWU上下文;
受保护的只读IDbSet _dbset;
#端区
#区域构造函数
公共数据存储库()
{
_上下文=新的CWSenties();
_dbset=_context.Set();
}
公共数据存储库(CWSenties上下文)
{
_上下文=上下文;
_dbset=_context.Set();
}
#端区
#区域方法
公共IQueryable All()
{
返回_context.Set();
}
//公共可查询AllInclude(参数表达式[]包含)
公共IQueryable包含(参数表达式[]包含)
{
IQueryable retValue=_context.Set();
foreach(包含中的var项目)
{
retValue=retValue。包括(项目);
}
返回值;
}
公共T GetById(对象id)
{
返回此。\u dbset.Find(id);
}
public IEnumerable Get(表达式filter=null,Func orderBy=null,
字符串includeProperties=“”)
{
IQueryable查询=_dbset;
if(过滤器!=null)
{
query=query.Where(过滤器);
}
foreach(includeProperty.Split中的var includeProperty
(新字符[]{',},StringSplitOptions.RemoveEmptyEntries)
{
query=query.Include(includeProperty);
}
if(orderBy!=null)
{
returnorderby(query.ToList();
}
其他的
{
返回query.ToList();
}
}
公共T添加(T实体)
{
如果(实体!=null)
{
返回_dbset.Add(实体);
}
返回null;
}
公共无效删除(对象id)
{
T entityToDelete=\u dbset.Find(id);
删除(id);
}
公共作废删除(T entityToDelete)
{
if(entityToDelete!=null)
{
if(_context.Entry(entityToDelete.State==EntityState.Detached)
{
_数据库集连接(entityToDelete);
}
_dbset.Remove(entityToDelete);
}
}
公共无效更新(T entityToUpdate)
{
if(entityToUpdate!=null)
{
_数据库集附加(实体更新);
_context.Entry(entityToUpdate.State=EntityState.Modified;
//_context.Entry(entity.State=System.Data.entity.EntityState.Modified;
}
}
公共虚拟void Save()
{
尝试
{
_SaveChanges();
}
捕获(DbEntityValidationException异常)
{
}
}
据我所知,您正试图添加具有相同主键的实体,正如您在示例中所说的
行加-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;
}
是否在删除和更新之间调用保存?是否可以发布调用存储库的代码?