如何为我的存储库创建一种方法来执行Upsert?

时间:2014-04-07 03:59:15

标签: c# entity-framework entity-framework-6

我正在使用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%的时间内无法进行插入,那么对象将出现给我更新它。

1 个答案:

答案 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”。