首页 新闻 会员 周边

咨询EF 的通用删除的代码如何写成通用的?

0
悬赏园豆:20 [已解决问题] 解决于 2013-08-26 08:30

尝试写一个通用的删除,即仅仅需要参数:实体类(对应表) abn,字段 id,字段的值 x,即可删除。
即将下面的代码写成通用的,感谢了,对 EF 真的困惑!

db.Entry(db.abns.Where(p=>p.ID== x).FirstOrDefault()).State = EntityState.Deleted;
db.SaveChanges(); 

ef
zhbj的主页 zhbj | 初学一级 | 园豆:165
提问于:2013-08-23 11:05
< >
分享
最佳答案
0

写成 DbContext 的扩展方法:

public static void Delete<TEntity>(this DbContext dbContext,Func<TSource, bool> predicate)

{

    DbSet<TEntity> dbSet = dbContext.Set<TEntity>();

    dbSet.Remove(dbSet.FirstOrDefault(predicate));   
}

 

// 调用:

db.Delete<abn>(p=> return p.ID == X;);

收获园豆:20
Launcher | 高人七级 |园豆:45045 | 2013-08-23 11:28

你好,提示

错误 32 扩展方法必须在非泛型静态类中定义 F:\CS_JSJC\jsjc\JSJC\Controllers\baseController.cs 21 18

还请您详细一些,感谢。

另外,请推荐一下学习此类技术的书籍,感觉非常迷茫,谢谢了,学习。

zhbj | 园豆:165 (初学一级) | 2013-08-23 15:46

@zhbj: public static class DbContextEx

{

public static void Delete<TEntity>(this DbContext dbContext,Func<TSource, bool> predicate)

{

    DbSet<TEntity> dbSet = dbContext.Set<TEntity>();

    dbSet.Remove(dbSet.FirstOrDefault(predicate));    }

}

哪类技术?

Launcher | 园豆:45045 (高人七级) | 2013-08-23 15:49

@Launcher: 就是 DbSet<TEntity> 或者  IQueryable<TEntity> 类的,还有 

context 的等等,就是阁下解决此类问题的相关技术书籍请推荐一下。

zhbj | 园豆:165 (初学一级) | 2013-08-23 16:21

@zhbj: 这还真没有啥书籍,语法和类库方面就是翻MSDN。

Launcher | 园豆:45045 (高人七级) | 2013-08-23 16:25

@Launcher:  

在controller 中,

public static class DbContextEx
{
public static void Delete<TEntity>(this DbContext dbContext, Func<TEntity, bool> predicate)
{
DbSet<TEntity> dbSet = dbContext.Set<TEntity>();
dbSet.Remove(dbSet.FirstOrDefault(predicate));
}


}

代码显示 

错误 34 类型“TEntity”必须是引用类型才能用作泛型类型或方法“System.Data.Entity.DbContext.Set<TEntity>()”中的参数“TEntity” F:\CS_JSJC\jsjc\JSJC\Controllers\baseController.cs 659 36

请好人做到底,帮助写一个详细的额,真心不明白。 感谢

zhbj | 园豆:165 (初学一级) | 2013-08-23 16:31

@zhbj: 

public static class DbContextEx {

public static void Delete<TEntity>(this DbContext dbContext, Func<TEntity, bool> predicate)

where TEntity : class 

{

DbSet<TEntity> dbSet = dbContext.Set<TEntity>(); dbSet.Remove(dbSet.FirstOrDefault(predicate));

}

 

// 泛型约束。

这些都可以在 MSDN 中介绍关于泛型的知识中找到。

}

Launcher | 园豆:45045 (高人七级) | 2013-08-23 16:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册