代码之家  ›  专栏  ›  技术社区  ›  Tahbaza

一个NHibernate显影剂的EF4?

  •  0
  • Tahbaza  · 技术社区  · 15 年前

    我需要第一次进入EF4,因为我经历了v1的失望。从那以后,我一直是一个快乐的NHibernate用户,但我现在需要为一个新的项目,因为客户的偏好,EF备份。

    是否有人为两个ORM概念之间的类比创建了快速指南?如果我把NHibernate的概念翻译成EF4的概念,它会给我一个良好的开端。

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

    任何见解都会受到赞赏,

    2 回复  |  直到 15 年前
        1
  •  4
  •   Tahbaza    15 年前

    由于没有人跳上这一个,我走出去,开始从网上的其他来源阅读,以拼凑出EF4似乎是什么。如果将来有人需要做这种调查,我会把我的资料贴在这里。

    这里有一个 rant 关于NH和EF,这是冗长的,但讨论了一些有趣的话题。

    微软 own documentation on EF 虽然完全忽略了POCO映射和更像NH的流畅映射,但它在这里还是有所帮助的。

    有一个新的附加到ef挂起,似乎模仿流畅的nh映射。这里有一个 good, simple article/overview 这是一个最新的链接 Microsoft CTP code-first site .

    Entity SQL 相当于HQL。

    Stored procedure mapping and execution 称为“函数映射”,与Linq to SQL的方法非常相似,只是据报道,现在很少有可能陷入未知的结果类型,因为您可以明确地返回Nothing、标量、复杂类型或实体。这里有一个 extra link on sp mapping 对于EF4。

    似乎有多种方法可以映射您的模型。使用EDMX设计器是一种完全自动化的方法,对于那些绝对控制映射的小型项目来说似乎非常好。

    有几种方法可以查询,对开发人员最友好的似乎是 LINQ to Entities 当然,这就像是从林肯到新罕布什尔州。

    这里是 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天前所在的人。

        2
  •  1
  •   Corey Coogan    15 年前

    您可能对来自NH的代码优先方法感兴趣。Ayende很快看了看,可能会给你一些价值。

    http://ayende.com/Blog/archive/2010/08/11/playing-with-entity-framework-code-only.aspx