エンティティ「ポートフォリオ」にいくつかの辞書を追加しました。その中の値はユーザーが直接更新するのではなく、エンティティ自体がこのディクショナリに入力/更新するメソッドを持っています。
return アクションの直前に、別の Controller からこの refresh メソッドを呼び出しています。
..
portfolio.refreshDicts();
db.SaveChanges();
デバッグすると、refreshDicts() が必要に応じて dict に 6 つの値を追加することがわかります。しかし、db.SaveChanges() を呼び出しても、これらは保存されません... 別のコントローラーで dict にアクセスしようとすると、それが空であることがわかります。
refreshDicts() (ポートフォリオのリストにオブジェクトを追加) を呼び出す前に、同じ Controller メソッドでポートフォリオに対して別の操作を実行していますが、これは正しく保存されます。
それはどうしてですか?ご協力ありがとうございました!
アップデート
辞書を使用したクラス ポートフォリオ
public class Portfolio
{
[Key]
public int ID { get; set; }
public string GroupID { get; set; }
public virtual List<KassenwirksamesEreignis> KassenwirksameEreignisse { get; set; }
public virtual List<InternMsg> InterneNachrichten { get; set; }
public virtual List<StockPosition> StockPositions { get; set; }
public virtual List<BondPosition> BondPositions { get; set; }
public virtual List<FuturePosition> FuturePositions { get; set; }
public virtual List<OptionPosition> OptionPositions { get; set; }
public virtual List<FondsPosition> FondsPositions { get; set; }
public virtual List<Regelereignis> RegelEreignisse { get; set; }
public Dictionary<DateTime, double> FondsVolumenDict { get; set; }
public Dictionary<DateTime, double> KasseDict { get; set; }
public Dictionary<DateTime, double> StockDict { get; set; }
public Dictionary<DateTime, double> OptionDict { get; set; }
public Dictionary<DateTime, double> FutureDict { get; set; }
public Dictionary<DateTime, double> FondsDict { get; set; }
public Dictionary<DateTime, double> BondDict { get; set; }
public Portfolio()
{
FondsVolumenDict = new Dictionary<DateTime, double>();
KasseDict = new Dictionary<DateTime, double>();
StockDict = new Dictionary<DateTime, double>();
OptionDict = new Dictionary<DateTime, double>();
FutureDict = new Dictionary<DateTime, double>();
FondsDict = new Dictionary<DateTime, double>();
BondDict = new Dictionary<DateTime, double>();
}
コントローラ:
public ActionResult Create(StockPosition position)
{
if (ModelState.IsValid)
{
// find user's portfolio
string currentUser = User.Identity.Name;
string userGroupId = db.UserProfiles.Single(x => x.UserName == currentUser).GroupId;
Portfolio portfolio = db.Portfolios.Single(x => x.GroupID == userGroupId);
// add Stock to portfolio
position.PortfolioID = portfolio.ID;
db.StockPositions.Add(position);
// book costs
var ke = new KassenwirksamesEreignis();
ke.Art = "Kauf";
ke.Bezeichnung = position.Bezeichnung;
ke.Date = DateTime.Now;
ke.Wert = Math.Round((-1.0) * (position.Menge * position.Kaufpreis), 2);
portfolio.KassenwirksameEreignisse.Add(ke);
// Dictionaries refreshen
portfolio.refreshDicts();
db.Entry(portfolio).State = EntityState.Modified;
// Save & Back
db.SaveChanges();
return RedirectToAction("../Portfolio/Index");
}
return RedirectToAction("../Portfolio/Index");
}
私のコンテキスト:
public class PlanspielContext : DbContext
{
public DbSet<Portfolio> Portfolios { get; set; }
public DbSet<UserProfile> UserProfiles { get; set; }
public DbSet<GlobalMsg> GlobalNachrichten { get; set; }
public DbSet<InternMsg> InterneNachrichten { get; set; }
public DbSet<Price> Prices { get; set; }
public DbSet<KassenwirksamesEreignis> KassenwirksameEreignisse { get; set; }
public DbSet<Zinsanspruch> Zinsansprüche { get; set; }
public DbSet<StockPosition> StockPositions { get; set; }
public DbSet<OptionPosition> OptionPositions { get; set; }
public DbSet<FuturePosition> FuturePositions { get; set; }
public DbSet<BondPosition> BondPositions { get; set; }
public DbSet<FondsPosition> FondsPositions { get; set; }
public DbSet<Regelereignis> Regelereignisse { get; set; }
// Am not sure if i need those here .. ?
//public Dictionary<DateTime, double> FondsVolumenDict { get; set; }
//public Dictionary<DateTime, double> KasseDict { get; set; }
//public Dictionary<DateTime, double> StockDict { get; set; }
//public Dictionary<DateTime, double> OptionDict { get; set; }
//public Dictionary<DateTime, double> FutureDict { get; set; }
//public Dictionary<DateTime, double> FondsDict { get; set; }
//public Dictionary<DateTime, double> BondDict { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
私が呼び出しているrefreshDictメソッド
public void refreshDicts()
{
refreshBondDict();
refreshFondsDict();
refreshFutureDict();
refreshOptionDict();
refreshStockDict();
refreshKasseDict();
refreshFondsVolumenDict();
}
public void refreshFondsDict()
{
DateTime today = DateTime.Now;
for ( var i = - 4; i <= 1; i++)
{
DateTime currentDay = today.AddDays(i).Date;
if (this.FondsDict.ContainsKey(currentDay))
{
this.FondsDict[currentDay] = getFondsValue(currentDay);
}
else
{
this.FondsDict.Add(currentDay, getFondsValue(currentDay));
}
}
}
....