导航
  • 主页
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm
  • WPF
  • 问答

EF LIINQ 有什么好的设计方法,前调调用方法感觉代码还多重复了。

禁用F3 2020-03-24 01:07:43

// 这一个删除方法,有好多个实体对象,就要写好多个,有什么方式可以扩展或复用呢?
public ActionResult Delete(int id)
{
//通过ID查询数据,删除。
var entity = DataContext.Category.Where(a => a.PK_ID == id).FirstOrDefault();
DataContext.Category.Remove(entity);
var res = DataContext.SaveChanges()
if (res > 0)
{
return Json(true, JsonRequestBehavior.AllowGet);
}
return Json(false, JsonRequestBehavior.AllowGet);
}

//想写成,前端AJAX过传一个实体名称,因为是前端调用。
public ActionResult Delete(int id,string modelType)
{
//可是这个modelType是字符串,后面的where条件没法写。
var entity = DataContext.Category.Where(a => a.PK_ID == id).FirstOrDefault();
//哪位有什么办法或高招指点一下呢?
}
...全文
1200 点赞 收藏 15
写回复
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_46674270 2020-03-28
不能直接下载
回复
艾克是大叔 2020-03-28
泛型+反射。如果你的API 都是 XXXXController XXXX = 实体类名的话 可以通过 反射 根据XXXXController 名字 找到 实体类的名字 然后创建一个类型传递过去 。 然后就是 把 CRUD的部分 像楼上说的 封装成泛型。然后你的实体类还必须 满足一些要求 比如说 主键都是一样的名字 实体类去继承一个BASEMODEL.
回复
淡蓝色月夜 2020-03-26
试试tt模板?
回复
正怒月神 2020-03-26
引用 8 楼 禁用F3 的回复:
[quote=引用 6 楼 正怒月神 的回复:] 这好像不是一个很困难的事情。 你创建一个 controller的基类 然后通过泛型实现crud的基本操作。
对,所有控制器继承基类,基类一个删除方法,前台调用一个这个基数方法是可以调用。但泛型的前提是,你调用泛型的时候,你是要转入实际的内类给他。这个实体的类型由谁转?我想解决的是,子类不要再创建方法调用父类的删除方法。这样还是会有相同的代码,第个子类都要调用一次基类的删除方法了。还是有很多相同的代码。[/quote] 你可以看一下我之前写的博客, 主要是这句话,可以把泛型加入到dbcontext上下文的管理
dbEF.Entry<T>(entity)
至于删除方法,其实也很方便,你可以传入指定的<T,S>2个泛型, T指代类型,S只带主键id的类型。 不过你也可以不设置S。(我是由于当时的项目中存在 id和 uuid,所以需要传入泛型) https://blog.csdn.net/hanjun0612/article/details/62887466
回复
正怒月神 2020-03-25
这好像不是一个很困难的事情。 你创建一个 controller的基类 然后通过泛型实现crud的基本操作。
回复
楠小南 2020-03-25
引用 10 楼 禁用F3 的回复:
[quote=引用 9 楼 chengangcsdn 的回复:]
泛型,

[quote=引用 1 楼 手在键盘敲很轻 的回复:]
泛型了解下
protected override T delete<T>(T entity)
{
return _context.Set<T>().Remove(entity);
}


参数可以再加一个 keyName与keyValue 就只是调用的地方每个实体传入不同而已了。删除本身操作是完全可以重用的。[/quote]

是的,我想解决的是调用方,有太多地方调用泛型方法来删除,所以想一个办法来解决。不用写太多的调用方[/quote]


泛型谁都知道!T类型 只能静态编译,不能动态,就是说你不能根据ajax 去选择这个T,这个T 一定要预先定义好的,既然这样你只能包一层,或者用反射 ! ajax 传递类名,然后反射出实体 再用ef 去删除,如果要参数的就抽象属性,不过这样扩展有限,治标不治本
回复
禁用F3 2020-03-25
引用 4 楼 楠小南 的回复:
我的做法是把增删改查封装进对象内部,ActionResult 方法根据id 用工厂去获取对象,然后调用对象 delete, 那样你的上家就稳定了,你把操作都写死在 ActionResult 还有什么扩展可言
我的是有封装的,可你这样每个类的对象,是不是都要写一个删除方法?然后把id去向工厂获取对象。这样还是会有很多相同的东西。 我现在是想,每个类的删除方法共用一人,而不是每个类创建一个ActionResult的删除方法。这样一个项目会太多的相同的代码。
回复
禁用F3 2020-03-25
引用 9 楼 chengangcsdn 的回复:
泛型, [quote=引用 1 楼 手在键盘敲很轻 的回复:] 泛型了解下 protected override T delete<T>(T entity) { return _context.Set<T>().Remove(entity); }
参数可以再加一个 keyName与keyValue 就只是调用的地方每个实体传入不同而已了。删除本身操作是完全可以重用的。[/quote] 是的,我想解决的是调用方,有太多地方调用泛型方法来删除,所以想一个办法来解决。不用写太多的调用方
回复
chengangcsdn 2020-03-25
泛型,
引用 1 楼 手在键盘敲很轻 的回复:
泛型了解下 protected override T delete<T>(T entity) { return _context.Set<T>().Remove(entity); }
参数可以再加一个 keyName与keyValue 就只是调用的地方每个实体传入不同而已了。删除本身操作是完全可以重用的。
回复
禁用F3 2020-03-25
引用 6 楼 正怒月神 的回复:
这好像不是一个很困难的事情。 你创建一个 controller的基类 然后通过泛型实现crud的基本操作。
对,所有控制器继承基类,基类一个删除方法,前台调用一个这个基数方法是可以调用。但泛型的前提是,你调用泛型的时候,你是要转入实际的内类给他。这个实体的类型由谁转?我想解决的是,子类不要再创建方法调用父类的删除方法。这样还是会有相同的代码,第个子类都要调用一次基类的删除方法了。还是有很多相同的代码。
回复
楠小南 2020-03-25
引用 5 楼 禁用F3 的回复:
[quote=引用 4 楼 楠小南 的回复:]
我的做法是把增删改查封装进对象内部,ActionResult 方法根据id 用工厂去获取对象,然后调用对象 delete,
那样你的上家就稳定了,你把操作都写死在 ActionResult 还有什么扩展可言


我的是有封装的,可你这样每个类的对象,是不是都要写一个删除方法?然后把id去向工厂获取对象。这样还是会有很多相同的东西。

我现在是想,每个类的删除方法共用一人,而不是每个类创建一个ActionResult的删除方法。这样一个项目会太多的相同的代码。[/quote]

可以泛型抽象继承的嘛,怎么会重复呢? 操作写在泛型父类 声明一下 virtual 然后派生不就好了,面向对象不都是这样的吗
回复
DbContext _context=new DbContext(connectionString);
回复
泛型了解下 protected override T delete<T>(T entity) { return _context.Set<T>().Remove(entity); }
回复
楠小南 2020-03-24
我的做法是把增删改查封装进对象内部,ActionResult 方法根据id 用工厂去获取对象,然后调用对象 delete,
那样你的上家就稳定了,你把操作都写死在 ActionResult 还有什么扩展可言
回复
禁用F3 2020-03-24
用泛型感觉行通的的。泛型还是要指定类。前台调用只能是转字符串,AJAX不可能转类型,
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.