Entity 的 Model类型该如何转化?

cnuusw 2011-09-25 02:03:20

//DAL层
public EasyFastCMS.Model.UserGroup GetModel(int ID)
{
Model.UserGroup model = new Model.UserGroup();
using (var edm = new EasyFastCMSEntities())
{
var query = edm.EasyFastCMS_UserGroup.Where(ug => ug.ID == ID);
foreach (EasyFastCMS_UserGroup ug in query)
{
model.ID = ug.ID;
model.GroupName = ug.GroupName;
}
}
return model;
}

//BLL层
private readonly SQLServerDAL.UserGroup dal = new SQLServerDAL.UserGroup();
public Model.UserGroup GetModel(int id)
{
return dal.GetModel(id);
}

//Web层

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
LoadInfo();
}
}

private void LoadInfo()
{
BLL.UserGroup bll = new BLL.UserGroup();
Model.UserGroup model = bll.GetModel(Convert.ToInt32(Request.QueryString["id"]));

this.Admin_Users_UserGroup_UserGroupUpDate_ltlID.Text = model.ID.ToString();
this.Admin_Users_UserGroup_UserGroupUpDate_txtGroupName.Text=model.GroupName;
this.Admin_Users_UserGroup_UserGroupUpDate_txtGroupIntro.Text=model.GroupIntro;
this.Admin_Users_UserGroup_UserGroupUpDate_txtOrderID.Text = model.OrderID.ToString();
ViewState["model"] = model;
}


如上代码。原本的程序架构为:
DAL
BLL
Model
Web

后来考虑使用ORM,在DAL中增加了一个EF。为了合理的分层,希望EF只负责数据库的增删改查,得到的结果转成Model层中对应的类,我现在的做法感觉是脱裤子放屁,太罗嗦,可是如果不这么做,那么EF就即充当了Model,又充当了DAL。感觉不合理。

能不能做到将EF得到的类(数据库表结果)EasyFastCMS_UserGroup 转化成 Model层中的UserGroup.cs类。当然如果能实现
List<EasyFastCMS_UserGroup> 转化成 List<UserGroup> 那就最好不过了。

求助解决办法。
...全文
510 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
正一大堆名词,懒得去理。

其实这些名词大多是必要的,可惜你可能无法理解。这些名词,比如什么Model、Entity、Command、GateWay之类的,都是前端跟业务逻辑层通讯所需要的,就好象千奇百怪成千上万种手机要跟移动公司的网络服务通讯一样,这个层面才体现出技术设计,才特别需要这些最最简单、最最基本概念。

你去纠结在后台一小点程序代码,去纠结如何把数据保存到关系数据库,用这个来解释model、entity之类的概念,不累吗?
  • 打赏
  • 举报
回复
对于那些想真正学好“三层”开发的人,我倒是几乎都是建议“直接使用ADO.NET去操作关系数据库就好了”。因为这些人基本上都是初学者,不去理解和设计BLL与更加丰富的业务实现(例如通讯、缓存、解析、动态的模式等等)反而纠缠什么DAL,是很难坚持看到希望的。
  • 打赏
  • 举报
回复
“为了三层而三层”确实是脱裤子放屁的,以前最出名的典型就属早期的PetShot了,微软找了几个人写了个程序,只不过是为了证明微软也有人会模仿一下java程序,没想到反倒成了“经典”。

作为一个“层”,DAL是应该在业务逻辑之前写好的,它与业务逻辑没有直接关系。就好象你写一个Sort<T>,或者Domain<T>,跟T的具体扩展并不没有直接关系,而是间接关系,是以后扩展的关系。然而看你的所谓DAL代码,你在写出一个UserGroup的实体之后想一行脱裤子放屁的所谓DAL代码到都不写,看来你是不懂的。既然如此,我建议你去使用Linq to SQL,或者也繁琐且过时的Linq to EF,总比在考虑业务逻辑时纠结于这些而毫无创意要强
z195389542 2011-09-27
  • 打赏
  • 举报
回复

List<UserGroup> list=(form 变量 in 数据源
where 条件
select new UserGroup{
ID = 数据源.ID;
GroupName = 数据源.GroupName
}).ToList();
cnuusw 2011-09-27
  • 打赏
  • 举报
回复
求助,是不是问题低级了?怎么没人理呢?
cnuusw 2011-09-26
  • 打赏
  • 举报
回复
沉得太快了,没人注意过吗?
cnuusw 2011-09-26
  • 打赏
  • 举报
回复
顶起来,求助。
dgtoday 2011-09-25
  • 打赏
  • 举报
回复
帮楼主顶一下,最近也在学EF,用了EF后,是不是就不需要MODEL层了。
cnuusw 2011-09-25
  • 打赏
  • 举报
回复
补充:1楼提供的办法编译通过 执行报错。
2楼的测试结果是ado直接操作


public EasyFastCMS.Model.UserGroup GetModel(int ID)
{
SqlParameter[] parameters = { new SqlParameter("@ID", SqlDbType.Int, 4) };
parameters[0].Value = ID;

EasyFastCMS.Model.UserGroup model = new EasyFastCMS.Model.UserGroup();

using (SqlDataReader rdr = SqlHelper.ExecuteReader(SqlHelper.ConnectionString, CommandType.StoredProcedure, "EasyFastCMS_UserGroup_GetModel", parameters))
{
while (rdr.Read())
{
model.ID = rdr.GetInt32(0);
model.GroupName = rdr.GetString(1);
model.GroupIntro = rdr.IsDBNull(2) ? "" : rdr.GetString(2);
model.GroupNum = rdr.GetInt32(3);
model.IsSys = rdr.GetBoolean(4);
model.OrderID = rdr.GetInt32(5);
}
}
return model;
}




与0楼办法的对比结果
cnuusw 2011-09-25
  • 打赏
  • 举报
回复
测试结果出来了。这样做强制类型转化和通常ado操作类比:(操作一万次)

ado:约1.3秒
转化:约16.9秒

性能差距:约 13倍
cnuusw 2011-09-25
  • 打赏
  • 举报
回复

public EasyFastCMS.Model.UserGroup GetModel(int ID)
{
Model.UserGroup model;
using (var edm = new EasyFastCMSEntities())
{
model = (Model.UserGroup)edm.EasyFastCMS_UserGroup.Where(ug => ug.ID == ID);
}
return model;
}



这样成功,但是个人感觉效率是问题,有没有办法可以不进行强制类型转化呢?
Entity Developer是一个强大的ORM设计器,支持 ADO.NET Entity Framework, NHibernate, LinqConnect 和 LINQ to SQL。你可以使用模型首先和数据首先的方法设计ORM模型并生成C#或者Visual Basic .NET代码。它引入了新的方法设计ORM模型,提高开发效率,简化数据库应用的开发。 可视化ORM模型设计器并支持代码生成 Entity Developer允许你可视化创建和编辑NHibernate,Entity Framework,LinqConnect 和 LINQ to SQL模型,无需一行XML代码。它支持创建各种一映射,如表分割,映射实体到多个表,复杂类型,继承分层,从Sel ect语句创建实体,从SQL代码创建方法等。由于使用了类似T4的模板,所以代码生成非常灵活,另外你还能创建自己的模板用于其他的编程语言。 多ORM支持 Entity Developer 支持 NHibernate, Entity Framework,LinqConnect 和 LINQ to SQL模型。 强大的代码生成 Entity Developer提供基于T4类似的模板生成代码框架,针对不同使用情况提供大量预定义的模板,模板化生成上下文,实体,映射,支持流,属性和XML映射,包括持久层感知和持久层无感知实体,支持验证框架等。另外模板提供自动生成MVC Controller和视图的功能。Data Transfer Object 提供转换器类和Data Annotations metadata类。 适用于各种.NET ORM的可视设计器 Entity Developer可以帮助您在一个统一的界面中为各种.NET ORM设计模型。您可以在一个工具中获得对所有ORM的支持,或者您可以购买单独的版本,与其中一个受支持的ORM一起使用。 支持EntityFramework和EF Core 对于Entity Framework v1-v6以及最新的EF Core2.2,我们的设计器提供了比EDM设计器更多的设计和代码生成功能。 Entity框架核心 设计实体框架核心模型可视化。通过大量设置获得模型优先和数据库优先支持。 NHibernate 直观地编辑NHibernate模型,为NHibernate 3或4生成XML,流畅或Loquacious映射和配置。 LINQ to SQL 直观地设计LINQ to SQL模型。 获得更好的模型优先和数据库优先支持,并轻松将模型更改应用于数据库。 LinqConnect 积极支持Devart的LINQ to SQL兼容ORM以及更多功能,Entity Developer作为其ORM设计器。 Telerik数据访问 可视化设计最新Telerik数据访问版本的模型,并通过Fluent Mapping API生成仅代码映射。 功能丰富的设计器,具有强大的代码生成功能 无缝Visual Studio集成 支持Model-First和Database-First 可视化创建几乎所有类型的映射 将模型更改应用于数据库,反之亦然 强大的模型重构 优化大型模型的工作 设计时LINQ / ESQL / HQL查询执行 查看和编辑源表中的数据 背景模型验证 基于T4模板的代码生成 大量预定义模板 生成C#或VB代码 每个类的文件,部分类生成 自定义属性支持 自定义模板支持 带语法高亮的模板编辑器 高质量的生成代码 高度可定制的一代
《Spring MVC 3.0实战指南》,参考《Spring 3.x企业应用开发实战》。 内容简介: 1、Spring MVC框架简介 2、HTTP请求地址映射 3、HTTP请求数据的绑定 4、数据转换、格式化、校验 5、数据模型控制 6、视图及解析器 7、其它 目录: Spring MVC 3.0新特性 Spring MVC框架结构 Spring MVC框架结构 框架的实现者 目录 HTTP请求映射原理 Spring MVC进行映射的依据 通过URL限定:URL表达式 通过URL限定:绑定{xxx}中的值 通过请求方法限定:请求方法 通过请求方法限定:代码示例 通过请求方法限定:模拟请求方法 通过请求/请求头参数限定:示例 通过请求/请求头参数限定:更多 目录 通过注解绑定:示意图 通过注解绑定:示例 通过注解绑定:小心抛出异常 使用命令/表单对象绑定 使用Servlet API对象作为入参 使用Spring的Servlet API代理类 使用IO对象作为入参 其他类型的参数 HttpMessageConverter HttpMessageConverter实现类 使用@RequestBody/@ResponseBody 使用HttpEntity/ResponseEntity 输出XML和JSON 使用HttpEntity/ResponseEntity 目录 数据绑定机理 数据类型转换 PropertyEditor依然有效 强大的ConversionService,让很多梦想成真 基于ConversionService体系,定义自定义的类型转换器 格式化:带格式字符串内部对象 相互转换 使用支持格式化的转换器 数据校验框架 JSR 303 数据校验框架 如何使用注解驱动的校验 使用校验功能时,处理方法要如何签名?? 校验错误信息存放在什么地方?? 页面如何显示错误信息 如何对错误信息进行国际化(1) 如何对错误信息进行国际化(2) 目录 数据模型访问结构 访问数据模型:ModelAndView 访问数据模型:@ModelAttribute 访问数据模型:Map及Model 访问数据模型:@SessionAttributes 一场由@SessionAttributes引发的血案... 如何避免@SessionAttributes引发的血案 目录 Spring MVC如何解析视图 视图解析器类型 基于协商的视图解析器 目录 本地化:基础原理 本地化:Spring MVC的本地化解析器 本地化:Spring MVC的本地化解析器 LocaleChangeInterceptor:通过URL参数指定 静态资源处理 静态资源处理:使REST风格的URL成为实现 静态资源处理:原理 静态资源处理:如何配置? 静态资源处理:如何配置? 物理静态资源路径映射逻辑资源路径 允许利用浏览器的缓存且不当心不同步 AQ?
《Spring MVC 3.0实战指南》,参考《Spring 3.x企业应用开发实战》。 内容简介: 1、Spring MVC框架简介 2、HTTP请求地址映射 3、HTTP请求数据的绑定 4、数据转换、格式化、校验 5、数据模型控制 6、视图及解析器 7、其它 目录: Spring MVC 3.0新特性 Spring MVC框架结构 Spring MVC框架结构 框架的实现者 目录 HTTP请求映射原理 Spring MVC进行映射的依据 通过URL限定:URL表达式 通过URL限定:绑定{xxx}中的值 通过请求方法限定:请求方法 通过请求方法限定:代码示例 通过请求方法限定:模拟请求方法 通过请求/请求头参数限定:示例 通过请求/请求头参数限定:更多 目录 通过注解绑定:示意图 通过注解绑定:示例 通过注解绑定:小心抛出异常 使用命令/表单对象绑定 使用Servlet API对象作为入参 使用Spring的Servlet API代理类 使用IO对象作为入参 其他类型的参数 HttpMessageConverter HttpMessageConverter实现类 使用@RequestBody/@ResponseBody 使用HttpEntity/ResponseEntity 输出XML和JSON 使用HttpEntity/ResponseEntity 目录 数据绑定机理 数据类型转换 PropertyEditor依然有效 强大的ConversionService,让很多梦想成真 基于ConversionService体系,定义自定义的类型转换器 格式化:带格式字符串内部对象 相互转换 使用支持格式化的转换器 数据校验框架 JSR 303 数据校验框架 如何使用注解驱动的校验 使用校验功能时,处理方法要如何签名?? 校验错误信息存放在什么地方?? 页面如何显示错误信息 如何对错误信息进行国际化(1) 如何对错误信息进行国际化(2) 目录 数据模型访问结构 访问数据模型:ModelAndView 访问数据模型:@ModelAttribute 访问数据模型:Map及Model 访问数据模型:@SessionAttributes 一场由@SessionAttributes引发的血案... 如何避免@SessionAttributes引发的血案 目录 Spring MVC如何解析视图 视图解析器类型 基于协商的视图解析器 目录 本地化:基础原理 本地化:Spring MVC的本地化解析器 本地化:Spring MVC的本地化解析器 LocaleChangeInterceptor:通过URL参数指定 静态资源处理 静态资源处理:使REST风格的URL成为实现 静态资源处理:原理 静态资源处理:如何配置? 静态资源处理:如何配置? 物理静态资源路径映射逻辑资源路径 允许利用浏览器的缓存且不当心不同步

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧