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> 那就最好不过了。

求助解决办法。
...全文
555 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;
}



这样成功,但是个人感觉效率是问题,有没有办法可以不进行强制类型转化呢?

62,252

社区成员

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

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

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

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