0

エンティティ「ポートフォリオ」にいくつかの辞書を追加しました。その中の値はユーザーが直接更新するのではなく、エンティティ自体がこのディクショナリに入力/更新するメソッドを持っています。

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));
            }
        }
    }
    ....
4

2 に答える 2