实体框架延迟加载的私有支持字段

时间:2013-02-06 15:43:11

标签: c# lazy-loading entity-framework-5

我正在使用启用了延迟加载的Entity Framework 5。我有以下代码:

    private ICollection<Subscription> _subscriptions = new Collection<Subscription>();

    public virtual ICollection<Subscription> Subscriptions
    {
        get { return _subscriptions; }
        set { _subscriptions = value; }
    }

但这有意义吗?我想确保公共属性Subscriptions永远不会为空。由于虚拟实体框架会覆盖getter和setter以提供延迟加载功能。

我是否需要此字段,或者我可以使用自动属性,如果没有订阅,我会得到一个空列表?

1 个答案:

答案 0 :(得分:6)

如果通过 new 关键字构建对象,则代码将起作用。但请注意many serializers function such that object constructors and field initializers do not work

由于这个原因,我已经确定了以下模式:

private ICollection<Subscription> _subscriptions;

public virtual ICollection<Subscription> Subscriptions
{
    get 
    {   
        if (_subscriptions == null) _subscriptions = 
            new Collection<Subscription>();

        return _subscriptions; 
    }
    set { _subscriptions = value; }
}

此代码模式适用于EF,无论对象是使用 new 实例化,还是使用不运行对象初始化代码的序列化器,都可以使用。

使用null-coalescing运算符也可以更紧凑地编写 get

    get 
    {   
        return _subscriptions ?? (_subscriptions = 
            new Collection<Subscription>()); 
    }