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

ORM-创建具有关联的对象

orm
  •  2
  • Dryadwoods  · 技术社区  · 16 年前

    示例:一个 Post Blog Tags 以及许多其他事情。....

    现在,当我尝试创建这个新的 发布 我需要做这样的事情:

    Post post = new Post();
    post.Blog = blog;
    .....
    

    ORM之前 我可以使用SQL查询创建对象,只传递博客的Id, 但现在

    还有一个类似的问题 here 但没有公认的答案。

    出于我之前解释的原因,我也不会缓存下拉框中的对象。

    我想创建这个 post Id blog 有什么办法吗?

    .

    备注 :使用NHibernate,但我认为这是一般的ORM问题。

    4 回复  |  直到 16 年前
        1
  •  1
  •   Survival    16 年前

    您可以使用投影类。只检索您需要的信息,而不是完整的数据库记录。

    举个例子:

    HqlBasedQuery query = new HqlBasedQuery(typeof(Post),
            @"
            SELECT tags.Id, tags.Name
            FROM Post post
            INNER JOIN post.Tags tags
            WHERE post.Id = ?
            ORDER BY tags.Name
            ", postId);
            var results = from object[] summary in (ArrayList)ActiveRecordMediator.ExecuteQuery(query)
                          select new YourProjectionClass
                          {
                              Id = (int)summary[0],
                              Name= (string)summary[1],
                          };
            return results.ToList<YourProjectionClass>();
    
        2
  •  0
  •   KLE rslite    16 年前

    在ORM中,您可以随心所欲:
    仅使用部分填充的博客创建帖子。

    这是一段非常普通的代码:

        Post post = new Post();
        post.setBlog(new Blog(123));
    

    我把这个留给你作为练习;-)


        3
  •  0
  •   Maurice Perry    16 年前

    右:如果ORM支持延迟获取(hibernate支持),sess.load(class,id)实际上不会生成任何SQL查询,而是返回一个未序列化的代理。

        4
  •  0
  •   wds    16 年前

    对于Hibernate(不是NHibernate,但应该类似),我相信你通常可以使用HQL查询来加载对象,如下所示:

    select id from Blog where ...
    

    您可以将其加载到博客对象中,它将透明地工作。如果您随后访问了任何未加载的属性,它将触发对其其余内容的查询(如果您将对象传递到其会话范围之外,则会触发LazyInitialization Exception)。

    无论如何,仅仅因为你有ORM框架为你做转换,并不意味着你可以免除关于如何加载对象的所有细节。事实上,正确使用数据访问层是最艰巨的挑战之一。尤其是在处理不太符合Hibernate“保持简单”原则的遗留数据库时。