【问题标题】:Private backing field for entity framework lazy loading实体框架延迟加载的私有支持字段
【发布时间】:2013-02-06 15:43:10
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    如果对象是通过 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 还是使用不运行对象初始化代码的序列化程序实例化,都适用。

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

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

    【讨论】:

    • 谢谢!您的吸气剂可以是:return _subscriptions ?? (_subscriptions = new Collection&lt;Subscription&gt;());。它有点短:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多