2016-12-21 9 views
0

私は2つのことをやろうとしています。最初に、ClientテーブルのレコードのIDを取得し、整数に変換します。私のクエリは大丈夫ですが、2番目のタスク、つまりInvestmentsテーブル(フィールド:Client_ID)のレコードを最初に言及したIDに更新するにはどうすればいいですか?ご協力いただきありがとうございます。おそらくこれを行うためのより良い方法があります。linqを使用してレコードのフィールドを更新するには

変更したとしてエンティティをマークする必要があり
[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "ID,LastName,Fund,PurchaseDate,Shares,PurchasePrice,PurchaseAmount")] Investments investments) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Ports.Add(investments); 
     db.SaveChanges(); 
     //db.SaveChanges(); 

     // write the Client_ID to the saved record 

     // first get the ID of the client 
     var q = (from c in context.Clients 
       where c.LastName == investments.LastName 
       select new 
       { 
        c.ID 
       }).ToList(); 

     // next update the Client_ID of the Investment record 
     var result = (from p in context.Investments 
         where (p.LastName == investments.LastName) 
         && (p.Client_ID == null) 
         select p); 

     //I'm not sure what to do next 

     //Context.SaveChanges(); 


     return RedirectToAction("Index"); 
    } 

    return View(investments); 
} 



++++++++++++++ new code 12/22/2016 - controller +++++++++++++++++ 

     public ActionResult Create([Bind(Include = "ID,LastName,Fund,PurchaseDate,Shares,PurchasePrice,PurchaseAmount")] Investments investments) 
     { 
      if (ModelState.IsValid) 
      { 

       var clientId = (from c in context.Clients 
           where c.LastName == investments.LastName 
           select new 
           { 
            c.ID 
           }).ToList().First(); 

       var productList = System.Collections.Generic.IList <Investments>{ investments }; 

       foreach (var investment in investments) 
       { 
        investment.Client_ID = clientId; 
       } 
       db.Ports.Add(investments); 
       db.SaveChanges(); 

       return RedirectToAction("Index"); 

      } 

      return View(investments); 
     } 
    +++++++++++++++++++++ model Investments +++++++++++++++++++++ 

using System; 
using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 

namespace StockHoldings.Models 
{ 
    public class Investments 
    { 
     public int ID { get; set; } 

     [Required] 
     [StringLength(20)] 
     public string LastName { get; set; } 

     [Required] 
     public string Fund { get; set; } 

     [Required] 
     [DataType(DataType.Date)] 
     [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] 
     public DateTime PurchaseDate { get; set; } 

     [Required] 
     [Range(1, 1000)] 
     public int Shares { get; set; } 

     [Required] 
     [Range(0.01, 200.00)] 
     [DataType(DataType.Currency)] 
     public double PurchasePrice { get; set; } 

     [DataType(DataType.Currency)] 
     public double PurchaseAmount { get; set; } 


    } 
+1

ここであなたがしたいことは不明です。なぜあなたは '投資'モデルにクライアントのFKプロパティを含めるべきかを示す 'Client'プロパティに' LastName'プロパティが含まれていますか? –

+1

@StephenMueckeは正しいです、InvestNameのLastNameが関連する場合データモデルが正規化されていないことを意味するクライアント。リレーショナルDBでは、データを複製してはいけません(MUST NOT)。データが矛盾してしまいます(クライアントが姓を更新した場合、すべての投資を更新しなければならない、あるいはデータが矛盾するでしょう。リレーショナルDB) – Piou

+0

あなたの投稿がC#言語を使用しているため、C#タグが追加されました。これにより、より多くのユーザーにアプローチするのに役立ちます。 – RBT

答えて

0

foreach(var toUpdate in result){ 
    toUpdate.Client_ID = q.First(); // or int.Parse(q.First()); 
    Context.Entry(toUpdate).State = EntityState.Modified; 
} 

Context.SaveChanges(); 

しかし、なぜ、あなたは実際にそれらを挿入する前にinvestementsを更新しない:

public ActionResult Create([Bind(Include = "ID,LastName,Fund,PurchaseDate,Shares,PurchasePrice,PurchaseAmount")] Investments investments) 
{ 
    if (ModelState.IsValid) 
    { 

     var clientId = (from c in context.Clients 
      where c.LastName == investments.LastName 
      select new 
      { 
       c.ID 
      }).ToList().First(); 

     foreach(var investment in investements){ 
      investment.Client_ID = clientId; 
     } 
     db.Ports.Add(investments); 
     db.SaveChanges(); 

     return RedirectToAction("Index"); 
    } 

    return View(investments); 
} 

ここで本当の質問は次のとおりです。

  1. wクライアントIDを姓で検索していますか?いいアイデアですか?あなたのエンドポイントもclientIdを受け取るべきでしょうか?

  2. あなたは既にclientIdを最初のビューbadまたはdataに渡して、このプロパティをフロントエンドで既に設定している投資オブジェクトを構築することはできませんか?

+0

foreach(投資に多額の投資){ investment.Client_ID = clientId; – DRL

+0

foreach(投資額の変動額){ investment.Client_ID = clientId; @Piou - StockHoldings.Models.Investmentsには、GetEnumeratorのパブリック定義が含まれていません。 – DRL

+0

foreach(投資に対するvar投資){ investment.Client_ID = clientId; @Piou - この行のエラー。 StockHoldings.Models.Investmentsには、GetEnumeratorのパブリック定義が含まれていません。 – DRL

関連する問題