自从遇到v1的失望以来,我第一次需要进军EF4。从那时起,我一直是一个快乐的nHibernate用户,但由于客户的偏好,我现在需要为新项目选择EF备份。
有没有人为这两者的ORM概念创建了类比的快速指南?如果我将nHibernate概念转换为EF4概念,它将为我提供一个可靠的开始。
例如,是否有类似于HQL(值得使用)的Criteria查询,类映射,sql自定义方言,在事务中登记项目,执行存储过程等等?
非常感谢任何见解,
答案 0 :(得分:4)
由于没有人跳过这个,我出去开始阅读网络上的misc来源,拼凑出EF4似乎是什么。如果将来有人需要进行此类调查,我会在此处粘贴我的来源。
这是关于NH与EF的rant,这篇文章很详细,但讨论了一些有趣的话题。
微软的own documentation on EF在这里,虽然完全忽略了看似更像NH的POCO映射和流畅映射,但它有点帮助。
EF待处理的新增功能似乎模仿了流畅的NH映射。这是该功能的good, simple article/overview,此处是指向最新Microsoft CTP code-first site的链接。
Entity SQL相当于HQL。
Stored procedure mapping and execution被称为“函数映射”,它与Linq to SQL的工作方式非常相似,不过现在据报道,由于您可以明确地返回,因此更难以使用未知结果类型。没有,标量,复杂类型或实体。这是EF4的extra link on sp mapping。
似乎有多种方法可以映射模型。使用EDMX设计器是一种完全自动化的方式,对于对映射的绝对控制过度的小型项目来说似乎非常有用。
有几种查询方式,大多数开发人员友好似乎是LINQ to Entities,当然是LINQ to NH。
这是another POCO mapping example。
总的来说,EF的当前状态感觉更像是LINQ to SQL而不是NHibernate,但考虑到L2S的易用性以及微软对EF的持续投资,这似乎是一个很好的起点。
最后,由于我是一名开发人员,我无法抗拒将其用于试驾。这是冰山探索的一小部分。 SQL事件探查器确认急切/延迟加载的工作方式与广告一致,并且更新仅更新已更改的字段。
// LINQ QUERY
using (MsgEntities ctx = new MsgEntities()) {
return (from m in ctx.Messages
where m.SentAt.Month == 11
select m).ToList();
}
// GET ONE WITH OBJECT GRAPH
Message msg = null;
MsgEntities ctx = new MsgEntities();
msg = ctx.Messages // .Include("MessageAttachments.Attachment") -uncomment for eager loading
.Where(m => m.PK_Message == PK_Message).SingleOrDefault();
// ADD
using (MsgEntities ctx = new MsgEntities()) {
ctx.Messages.AddObject(new Message() {
Dsc = "added message @ " + DateTime.Now.ToString("dd-MMM-yy HH:mm:ss"),
OriginalRecipientDsc = "Tahbaza",
Sender = "Tahbaza",
SentAt = new DateTime(2008, 11, 15),
Subject = "Nothing special"
});
}
// UPDATE
Message m = GetOneMessage(3);
using (MsgEntities ctx = new MsgEntities()) {
ctx.Attach(m);
m.Subject = "message UPDATED @ " + DateTime.Now.ToString("dd-MMM-yy HH:mm:ss");
ctx.SaveChanges();
}
// DELETE
Message m = GetOneMessage(3);
using (MsgEntities ctx = new MsgEntities()) {
ctx.Attach(m);
ctx.DeleteObject(m);
ctx.SaveChanges();
}
我希望这可以帮助我2天前的某个人。
答案 1 :(得分:1)
您可能对来自NH的代码优先方法感兴趣。 Ayende很快就看到它可能会给你一些价值。
http://ayende.com/Blog/archive/2010/08/11/playing-with-entity-framework-code-only.aspx