EF4是否为nHibernate开发人员?

时间:2010-08-20 03:11:55

标签: nhibernate entity-framework fluent-nhibernate entity-framework-4

自从遇到v1的失望以来,我第一次需要进军EF4。从那时起,我一直是一个快乐的nHibernate用户,但由于客户的偏好,我现在需要为新项目选择EF备份。

有没有人为这两者的ORM概念创建了类比的快速指南?如果我将nHibernate概念转换为EF4概念,它将为我提供一个可靠的开始。

例如,是否有类似于HQL(值得使用)的Criteria查询,类映射,sql自定义方言,在事务中登记项目,执行存储过程等等?

非常感谢任何见解,

2 个答案:

答案 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