我正在使用EF6.1。我有一个包含这些Insert和Update方法的存储库:
public virtual void Insert(TEntity entity)
{
((IObjectState) entity).ObjectState = ObjectState.Added;
_dbSet.Attach(entity);
_context.SyncObjectState(entity);
}
public virtual void Update(TEntity entity)
{
((IObjectState) entity).ObjectState = ObjectState.Modified;
_dbSet.Attach(entity);
_context.SyncObjectState(entity);
}
这些是从我的控制器调用的:
public HttpResponseMessage Post(Exam exam)
{
try
{
_examService.Insert(exam);
_unitOfWork.SaveChanges();
return Request.CreateResponse<Exam>(HttpStatusCode.Created, exam);
}
catch (Exception ex)
{
return Request.CreateErrorResponse(HttpStatusCode.Conflict, ex);
}
}
public HttpResponseMessage Put(int id, Exam exam)
{
if (id != exam.ExamId)
{
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
try
{
_examService.Update(exam);
_unitOfWork.SaveChanges();
return Request.CreateResponse<Exam>(HttpStatusCode.OK, exam);
}
catch (DbUpdateConcurrencyException ex)
{
return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex);
}
}
并在我的服务层:
public virtual void Insert(TEntity entity)
{
_repository.Insert(entity);
}
public virtual void Update(TEntity entity)
{
_repository.Update(entity);
}
我遇到了一个问题,因为我的应用程序想要进行更新,但数据库中可能没有对象要更新。在这种情况下,我希望我的代码代替插入。
有没有办法通常使用存储库模式处理?我读到了Oracle,他们有一个upsert命令。但是,我使用的是SQL Server 2012以及服务层和存储库。对我来说这样做的好方法是什么?我真的希望有一些方法来尝试更新,如果它在99%的时间内无法进行插入,那么对象将出现给我更新它。
答案 0 :(得分:-1)
不幸的是,EF 6.x还没有UPSERT功能。
如果设置了实体的主键,EF将生成更新查询,如果未设置,则生成插入查询。
public virtual void Save(TEntity entity)
{
// assuming TEntity as property "Id" [Key] of type int
((IObjectState) entity).ObjectState = entity.Id <= 0 ? ObjectState.Added : ObjectState.Modified;
_dbSet.Attach(entity);
_context.SyncObjectState(entity);
}
更新数据库中不存在的实体时,请将“Id”设置为“0”。