实体框架用户定义的属性将被忽略

时间:2013-12-30 17:09:01

标签: c# entity-framework orm

我有一个包含getter和setter属性的类。
这个想法很简单 - 在DB中存储一个集合并将其映射到属性setter中的字典中。
但是,此属性将被忽略
当我用自动getter和setter切换到同一个属性时,一切正常 这不是懒惰的加载问题,因为其他记录的属性按预期加载。

public class RatesBoard 
{ 
    #region Ctor 

    public RatesBoard() 
    { 
        ID = -1; 
        Rates = new List<Rate>(); 
    } 

    #endregion 

    #region Members And Properties 

    private Dictionary<string, Rate> _rates = new Dictionary<string, Rate>(); 

    /// <summary> 
    /// The rates board ID 
    /// </summary> 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    /// <summary> 
    /// The rates as flat list 
    /// </summary> 
    /// <remarks>Notice that this is a cloned list so any additions to add will not reflect in the board</remarks> 
    public virtual ICollection<Rate> Rates 
    { 
        get 
        { 
            return _rates.Values.ToList(); 
        } 
        set 
        { 
            _rates.Clear(); 

            if (value != null) 
            { 
                foreach (Rate rate in value) 
                { 
                    _rates.Add(rate.RelatedCountryID, rate); 
                } 
            } 
        } 
    } 

    //This one works!!!!
    //public virtual ICollection<Rate> Rates 
    //{ 
    //    get; 
    //    set; 
    //} 
    #endregion 

    #region Methods 

    /// <summary> 
    /// Returns the rate for a country 
    /// </summary> 
    /// <param name="countryUNId">The country UN id</param> 
    /// <returns>The country rate or null if there is no entry for that country</returns> 
    public Rate GetRateDetails(string countryUNId) 
    { 
        if (!_rates.ContainsKey(countryUNId)) 
        { 
            return null; 
        } 

        return _rates[countryUNId]; 
    } 

    #endregion 
}

1 个答案:

答案 0 :(得分:2)

如果我正确理解EF,在对象实现期间,如果列表不是null,则会将项目添加到列表中。否则,它将使用底层成员变量来初始化列表。 (我想是的,因为EF也可以在没有setter的情况下实现集合属性)。

该行

return _rates.Values.ToList();

始终返回新列表。这意味着EF将使用此列表添加项目。它不会使用成员变量_rates,也不会使用setter。因此,项目将添加到临时列表中。下次访问时,您会看到没有项目的新瞬态列表。也许这个解释并不是完全可靠的,但我确信它已经足够接近了。

自动属性是首选样式。不仅因为它使EF工作,而且因为通常不鼓励在属性设置器或吸气剂中加入太多逻辑。 “财产”这个词传达了它只是你可以获得或设定的价值。也许你可以在那里进行一些验证,为了方便而进行一些惰性初始化,但不是任何比预期行为更多的东西:“我设置了这个值,现在我的对象这个值”。