EF 6使用通用方法插入,更新和删除

时间:2017-06-23 18:02:00

标签: c# entity-framework generics

我创建了web服务asp API宽度EF 6来连接sql server ..我创建了通用方法来执行Insert&更新&删除..方法是

    protected enum ExecuteActions
    {
        Insert,
        Update,
        Delete
    }
protected ResponseResult Execute<T>(T entity,ExecuteActions exAction) where T:class
{
      var model = db.Set<T>();
      switch (exAction)
                {
                    case ExecuteActions.Insert:
                        model.Add(entity);
                        break;
                    case ExecuteActions.Update:
                        model.Attach(entity);
                        db.Entry(entity).State = System.Data.Entity.EntityState.Modified;
                        break;
                    case ExecuteActions.Delete:
                        model.Attach(entity);
                        db.Entry(entity).State = System.Data.Entity.EntityState.Deleted;
                        break;

                    default:
                        break;
                }
                  db.SaveChanges();    
}

Insert工作正常,但问题出在Update案例中......与某些实体和其他一些实体合作的难以理解的事情会引发错误

  

附加类型为&x; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&#39;的实体失败,因为同一类型的另一个实体已具有相同的主键值。使用&#39;附加&#39;方法或将实体的状态设置为“未更改”#39;或者&#39;修改&#39;如果图中的任何实体具有冲突的键值。这可能是因为某些实体是新的并且尚未收到数据库生成的键值。在这种情况下,请使用&#39;添加&#39;方法或“添加”#39;实体状态跟踪图形,然后将非新实体的状态设置为“未更改”。或者&#39;修改&#39;酌情。

我找到了一些解决方案,解释说我必须使用(查找)获取实体而不是更新它...但它与我的工作不兼容..因为我不知道通用类型的ID方法。

我也试过了this

在另一个项目中它的工作方式类似于这个方法..所以我认为实体框架元素(edmx)的问题..所以我删除它并重新创建它但没有发生任何事情

1 个答案:

答案 0 :(得分:2)

为您的实体类型创建一个界面,例如:

public interface IKeyed{
     int KeyValue{get;}
}

然后让您的实体实现接口,例如:

public partial class Foo : IKeyed{
     public int KeyValue {get {return this.Id;}}
     public int Id {get; set;}
}

然后更新您的Generic方法签名以将T定义为IKeyed

protected ResponseResult Execute<T>(T entity,ExecuteActions exAction) 
                                    where T : class, IKeyed

然后参考

entity.KeyValue 

使用实体框架&#34;&#34;查找&#34;方法