我创建了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)的问题..所以我删除它并重新创建它但没有发生任何事情
答案 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;方法