【问题标题】:Add child object to parent without querying parent将子对象添加到父对象而不查询父对象
【发布时间】:2013-08-09 22:32:00
【问题描述】:

如何在不发出select 语句来获取父对象的情况下将子对象添加到父集合中,同时保持域模型的完整性?

我有以下型号:

public class Post
{
    private readonly IList<Comment> _comments = new List<Comment>();
    public virtual IList<Comment> Comments { get { return _comments; } }

    public virtual void AddComment(string text)
    {
        var comment = new Comment
            {
                Post = this,
                Text = text
            };

        _comments.Add(comment);
    }
}

public class Comment
{
    public virtual int Id { get; set; }
    public virtual Post Post { get; set; }
    public virtual string Text { get; set; }
}

这是我目前正在做的事情:

var post = session.Load<Post>(1);
post.AddComment("Test comment.");
transaction.Commit();

这种方法的问题是,当我在Post 代理上调用AddComment() 时,NHibernate 会加载整个帖子,从而针对数据库发出选择语句。我想通过始终调用 AddComment() 来添加 cmets 来保护 _comments 列表。

是否可以保持我的域模型的完整性并将子级添加到父级而不查询父级?

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    我能想到几种方法:

    1. 不要映射评论列表,只映射每条评论的帖子。当您需要整个 cmets 列表时,通过查找具有特定父 Add to Nhibernate collection without initializing the collection 的所有评论来动态加载它。这将保持您的域模型完整性。

    2. 双向映射,但将更新注释设为父级,而不是列表。下次您从数据库加载列表时,列表将得到更新。这更有问题,因为您的域在此过程中不正确,但可能仍然可以 - 这取决于您的要求,以及在此过程中是否访问了您的域(我假设您不需要列表,因为您不希望加载它们)

    3. 完全绕过 NHibernate。我曾经不得不做这样的事情。我有一个场景,其中父对象有大量字符串,我需要向每个集合添加更多字符串。字符串上没有父字段,我不希望将它们包装在对象中。我不 请记住,如果我有其他原因,但我确实有一个非常紧迫的截止日期和严重的性能问题。我创建了一个简单的 SQL 查询来完成这项工作,它做得很好。这不是我引以为豪的解决方案,但这是我觉得 ORM 不完全适合这项工作的工具之一。我担心将来会更改列名或表名,但由于我的映射是使用 Fluent Nhibernate 在代码中完成的,所以问题得到了解决。

    【讨论】:

      【解决方案2】:

      如果您在Post 中的IList 映射上设置inverse=true,则Comment 实体将负责维护关系。像这样的东西应该可以工作:

      var comment = new Comment();
      comment.Post = session.Load<Post>(1);
      comment.Text = "Test comment";
      transaction.Commit();
      

      但是,作为替代方案,请考虑按主键进行选择是否真的会造成如此大的性能损失;在大多数情况下,它不会。 NHibernate 有时会发出一个额外的 SELECT,这是您在手动数据访问层中看不到的。您可以尝试规避这一点,就像您在这里所做的那样,但这可能不值得。考虑为 ORM 的便利性付出的(非常小的)代价。在性能问题出现时处理,而不是之前处理。

      【讨论】:

        猜你喜欢
        • 2016-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-19
        • 1970-01-01
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多