我有一个包含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
}
答案 0 :(得分:2)
如果我正确理解EF,在对象实现期间,如果列表不是null
,则会将项目添加到列表中。否则,它将使用底层成员变量来初始化列表。 (我想是的,因为EF也可以在没有setter的情况下实现集合属性)。
该行
return _rates.Values.ToList();
始终返回新列表。这意味着EF将使用此列表添加项目。它不会使用成员变量_rates
,也不会使用setter。因此,项目将添加到临时列表中。下次访问时,您会看到没有项目的新瞬态列表。也许这个解释并不是完全可靠的,但我确信它已经足够接近了。
自动属性是首选样式。不仅因为它使EF工作,而且因为通常不鼓励在属性设置器或吸气剂中加入太多逻辑。 “财产”这个词传达了它只是你可以获得或设定的价值。也许你可以在那里进行一些验证,为了方便而进行一些惰性初始化,但不是任何比预期行为更多的东西:“我设置了这个值,现在我的对象有这个值”。