如何避免在构造函数中调用虚函数?

Ros*_*sim 19 .net c# entity-framework entity-framework-5

大多数(如果不是全部)我的实体框架POCO都具有虚拟功能.我需要这些函数是虚拟的,以便实体可以延迟加载.

如果我Accommodations在构造函数中初始化,那么我将在构造函数中调用虚函数,这是不好的做法.

但是Accommodations如果不在构造函数中,我怎么能初始化?

public class Venue
{
    public Venue()
    {
        Accommodations = new HashSet<Accommodation>();
    }

    public virtual ICollection<Accommodation> Accommodations { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Thi*_*lva 15

另一种选择是将setter标记为private.这将消除在构造函数中调用虚拟成员的问题.

完成此操作后,您需要为调用者(EF除外)提供设置所需属性的方法.您可以使用重载的构造函数来传递一个包含列表,或者可选地封装您的集合(域驱动设计)并使用方法来添加/删除项目(注意,使用EF这会变成"hackish",因为它缺乏对完全封装的支持集合,与NHibernate不同):

public class Venue
{
    public Venue()
    {
        Accommodations = new HashSet<Accommodation>();
    }

    public Venue(ICollection<Accommodation> accommodations)
    {
        Accommodations = new List<Accommodation>(accommodations);
    }

    public virtual ICollection<Accommodation> Accommodations { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

  • 正是我需要的.有趣的是这个问题已经超过一年了,然而你在我寻找它之前仅仅4个小时就发布了这个答案! (2认同)

Moo*_*ice 13

public class Venue
{
    private accommodations_ = new HashSet<Accommodation>();

    public Venue()  { }

    public virtual ICollection<Accommodation> Accommodations 
    {
        get { return accommodations_; }
        set { accommodations_ = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 那个奇怪的命名约定是什么?您通常将下划线放在前面. (3认同)