4

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

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

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

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

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

4

1 回答 1

6

如果对象是通过new关键字构造的,则您的代码将起作用。但是请注意,许多序列化程序的功能使得对象构造函数和字段初始值设定项不起作用

出于这个原因,我选择了以下模式:

private ICollection<Subscription> _subscriptions;

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

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

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

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

    get 
    {   
        return _subscriptions ?? (_subscriptions = 
            new Collection<Subscription>()); 
    }
于 2013-02-06T15:45:20.693 回答