流利的NHibrnate - 构造函数中的虚拟调用 - 最佳实践

时间:2011-03-15 15:58:55

标签: nhibernate fluent-nhibernate

我有一个与此类似的实体:

public class Comment 
{
  public Comment(string text, DateTime creationDate, string authorEmail)
  {
    Text = text;
    CreationDate = creationDate;
    AuthorEmail = authorEmail;
  }

  public virtual string Text { get; private set; }
  public virtual DateTime CreationDate { get; set; }
  public virtual string AuthorEmail { get; private set; }
}

我是从Is it OK to call virtual properties from the constructor of a NHibernate entity?

取的

我收到警告为“构造函数中的虚拟调用”。

尽管如此,它并没有带来任何实际问题,因为虚拟成员仅为NH代理申报。但是,我想知道是否应该将构造函数方法移动到新的 factory 类,并将新方法声明为

CreateComment(string text, DateTime creationDate, string authorEmail)  

在这种情况下,最佳做法是什么?

请注意,目前我的域实体中有4-5个重载的构造函数。以上只是一个例子 谢谢!

3 个答案:

答案 0 :(得分:1)

我已经使用FluentNHibernate进行了测试,你可以这样做:

public class Comment
{
    private string _text;
    private DateTime _creationDate;
    private string _authorEmail;

    public Comment(string text, DateTime creationDate, string authorEmail)
    {
        _text = text;
        _creationDate = creationDate;
        _authorEmail = authorEmail;
    }

    public virtual string Text
    {
        get { return _text; }
        private set { _text = value; }
    }

    public virtual DateTime CreationDate
    {
        get { return _creationDate; }
        set { _creationDate = value; }
    }

    public virtual string AuthorEmail
    {
        get { return _authorEmail; }
        private set { _authorEmail = value; }
    }
}

答案 1 :(得分:0)

我更喜欢使用无参数(默认)构造函数并构造如下:

var comment = new Comment {
                  Text = "Something offensive and political.",
                  CreationDate = DateTime.Now,
                  AuthorEmail = "someonestupidwithanopinion17@aol.com"
              };

现在问题无关紧要。

答案 2 :(得分:0)

如果你的属性只是虚拟的,可以容纳nHibernate,你可以让它们封装具体的字段(nhibernate知道如何处理它:参见here(默认访问)和here(访问) 。
它也得到了流利的支持。