Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 使用实体框架删除然后插入值_Entity Framework_Unit Of Work - Fatal编程技术网

Entity framework 使用实体框架删除然后插入值

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

我的要求是,我需要从表中删除一些行,然后在同一个表中插入一些行。我使用的是工作单元,因此删除和插入都是同一事务的一部分。但当我试图保存数据时,实体框架出现了重复键抛出错误。请在下面查找示例和代码:

示例:表名-表1,列-col1(c.K)、col2(c.K)、col3

要删除的行-78,1,1

要添加的行-78,1,1 78,2,2

我的工作单元是:

公共类数据存储库: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;
}

是否在删除和更新之间调用保存?是否可以发布调用存储库的代码?