Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
3.8k views
in Technique[技术] by (71.8m points)

请教ORM+MVC的实体和模型问题

我长期用的是WinForm+ADO.NET,以SqlCommand+DataTable+DataGridView为伴,现在刚接触EF+MVC/MVVM+WPF,感觉与ado.net时代的套路很不同,数据不再用DataSet/DataTable承载,而是用具体的实体类和模型类承载。

我想请教的是,业务表的字段往往是不带资料的,比如订单明细表,通常只会记录产品ID,ID外键关联到产品表,产品表中才有产品名称等更多产品信息。如果说实体类Entity是对应库表中的一行的话,那订单明细实体应该长这样:

class OrderDetailEntity {
  int Id;
  int OrderId;
  int ProductId;
}

那我在程序中显然不能只呈现这个实体,总得带上产品名称等东西,那么,我是需要专门为这个grid/view创建一个用于呈现的类吗?比如:

class OrderDetail {
  int Id;
  int OrderId;
  int ProductId;
  string ProductName;
  //还是应该
  Product Product; //连上面的ProductId都可以不要?
}

这个东西叫模型Model吗?需要为每个grid专门建个这样的类吗?Controller是应该返回单个这样的类还是订单明细实体+产品实体?如果是前者,是通过context.OrderDetail.Where().Include()得到带产品资料的OrderDetail吗?

如果是新增/修改操作put/post/patch,接受一个OrderDetail对象,那是要在Controller中将它转换成订单明细实体OrderDetailEntity再回写库表还是怎样?

DTO又是什么?是与模型差不多的一回事吗?

不好意思问题有点多,可能一上手就是ORM+MVC还好点,从别的套路转过来的反而觉得没以前直接,要定义那么多类。还请不吝指教,感谢!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

第一个问题,你这种本质上就是多个表 JOIN 嘛。你可以简单的把一个表就当做一个实体,而不是根据查询结果来建实体。我不知道你用的是 EF 哪种模式,就当做 CodeFirst 好了,这里其实利用导航属性就好,具体的你可以搜这个关键字看下例子。

第二个问题,严格来说应该是一个“实体”(Entity),但也可以算是一个低配版的 ModelEntity 是描述数据关系的,本质就是对数据库表结构的映射;Model 是描述业务的。Controller 里接收的是 Model,写入数据库的是 Entity,两者可能完全一致,也可能不一致,具体如何取决于你的业务。

第三个问题,DTO 就是简化的 Entity,只剩下属性、甚至部分属性了。毕竟可能你一个表里十几个字段,但业务处理上只需要其中几个。当然了,不要 DTO、直接拿 Entity 来回传也不是不行。

如果实在还是分不清,只保留 Entity 也行。

P.S. 建议找个三层架构的开源项目看看,比如微软官方给的样板项目 PetShop 就挺好,网上也有很多精读讲解的资料。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

1.4m articles

1.4m replys

5 comments

57.0k users

...