Estimate というクラスがあり、次のフィールドとプロパティがあります。
private IList<RouteInformation> _routeMatrix;
public virtual IList<RouteInformation> RouteMatrix
{
get
{
if (_routeMatrix != null && _routeMatrix.Count > 0)
{
var routeMatrix = _routeMatrix.ToList();
routeMatrix =
routeMatrix.OrderBy(tm => tm.Level.LevelType).ThenBy(tm => tm.Level.LevelValue).ToList();
return routeMatrix;
}
else return _routeMatrix;
}
set { _routeMatrix = value; }
}
そのため、getter メソッドでは、_routeMatrix をレベル タイプで並べ替え、次にレベル値で並べ替えて、並べ替えられたリストを返しています。
私のプログラムの1つに、次のコードがあります。
public void SaveApprovers(string[] approvers)
{
int i = 1;
foreach (var approver in approvers)
{
var role = Repository.Get<Role>(long.Parse(approver));
var level = new Models.Level
{
LevelType = LevelType.Approver,
LevelValue = (LevelValue)i,
Role = role
};
Repository.Save(level);
var routeInformation = new Models.RouteInformation
{
Level = level,
RouteObjectType = RouteObjectType.Estimate,
RouteObjectId = _estimate.Id
};
Repository.Save(routeInformation);
_estimate.RouteMatrix.Add(routeInformation); // <--- The problem is here
Repository.Save(_estimate);
i++;
}
}
問題は、複数の承認者がいる場合 (つまり、approvers
配列の長さが 1 より大きい場合、最初のものだけrouteInformation
が に追加されることRouteMatrix
です。残りの承認者がどうなるかはわかりませんが、Add メソッドはそうではありません。エラーが発生しません。
以前は、RouteMatrix はパブリック フィールドでした。この問題は、プライベートにしてパブリック プロパティにカプセル化した後に発生し始めました。