2016-12-19 34 views
1

私のアプリケーションは、ユーザーが予定の予定を個人の予定表に追加できるようにするためのものです。パーソナルカレンダーは、単一のテーブルとして実装され、すべてのユーザーで共有され、string UserIDの値をint EventIDにリンクし、プライマリキーに別のint UserCalendarIDを割り当てます。ASP.NET MVC - テーブルが更新されない

ただし、アクションが呼び出されるとテーブルは更新されません。アクションは下に掲載されています。参考のために

[HttpPost] 
    public IActionResult AddToCalendar(int ID) 
    { 
     var events = context.Events.ToList(); 
     Event _e = events.FirstOrDefault(x => x.EventID == ID); 
     var calendars = context.Calendars.ToList(); 
     UserCalendar c = new UserCalendar 
     { 
      UserID = userManager.GetUserAsync(HttpContext.User).Result.UserName, 
      EventID = _e.EventID 
     }; 
     calendars.Add(c); 
     context.SaveChanges(); 
     return View("Index"); 
    } 

、これはイベントテーブルにイベントを追加する(作業)コードです:

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<IActionResult> NewEvent(Models.NewEventViewModel model, string returnUrl = null) 
{ 
    ViewData["ReturnUrl"] = returnUrl; 
    if (ModelState.IsValid) 
    { 
     var newEvent = new Event { 
      Artist = await userManager.GetUserAsync(HttpContext.User), 
      EventName = model.EventName, 
      Time = model.Time, 
      Venue = model.Venue, 
      GenreID = model.GenreID 
     }; 
     var events = context.Events; 
     events.Add(newEvent); 
     context.SaveChanges(); 
     ViewBag.Notification = "Your event has been added."; 
     ViewBag.Color = "Green"; 
    } 
    else { 
     ViewBag.Notification = "Something went wrong — Event not added."; 
     ViewBag.Color = "Red"; 
    } 
    return View("Index"); 
} 

私はAddToCalendarのためのViewModelを使用していない理由特にそれについての見解はないということです。むしろ、それは次のように定義されてEventDetailsページ上のフォームにボタンによってトリガされます:

@model Event 
@{ 
    ViewData["Title"] = "Event Details"; 
    Event e = ViewBag.Event; 
} 

<h2>@ViewData["Title"]</h2> 

<p><b>Event Name: </b>@e.EventName</p> 
<p><b>Artist: </b>@e.Artist.ClientName</p> 
<p><b>Date and Time: </b>@e.Time</p> 
<p><b>Genre: </b>@e.Genre.GenreName</p> 
<p><b>Venue: </b>@e.Venue</p> 

@if (ViewBag.isYours) 
{ 
    <a asp-action="DeleteEvent" asp-controller="Home" class="btn btn-danger" [email protected]>DELETE</a> 
    <a asp-action="EditEvent" asp-controller="Home" class="btn btn-success" [email protected]>EDIT</a> 
} 
<form asp-action="AddToCalendar" asp-controller="Home" [email protected] asp-route-returnurl="@ViewData["ReturnUrl"]"> 
    <input type="submit" value="Add To Your Calendar" class="btn btn-default" /> 
</form> 

私はすでにccalendarsに追加されていることを確認しています。 AddToCalendarイベントによってテーブルが更新されないのはなぜですか?

+0

データベースの実際のコンテキストではなく、メモリ内のリストに "c"を追加しています。 context.Calendars.Add(c)を使用してみてください。その後、context.SaveChanges()の呼び出し後に更新する必要があります。 –

+0

申し訳ありませんが、私はあなたがその下の「イベント」をどのように使用していたのか迷っていました。同じ方法で使いたい場合は、次の行からToList()を削除するだけです:var calendars = context.Calendars.ToList()。これは、ToList()から返されるリストの代わりにデータベースコンテキストオブジェクトを追跡する必要があります –

+1

2番目のオプションが機能しました。私はそれを受け入れることができるように答えとして投稿することを検討しますか? – Passage

答えて

1

お知らせ、データベースコンテキストからカレンダーを取得しているとき、あなたが呼んでいる:

var calendars = context.Calendars.ToList(); 

これはメモリにUserCalendarオブジェクトのリストをロードします。これは、データベース内の実際のカレンダーテーブルを追跡しません。あなたのイベントテーブルに追加するときには、このようなイベント・テーブル・オブジェクトになっています

var events = context.Events; 

お知らせを、あなたは実際のコンテキストオブジェクトへの参照を追加している意味「ToListメソッド()」、への呼び出しはありませんメモリ内のリストだけでなく、 "イベント"

カレンダーを取得する呼び出しから.ToList()を削除すると、イベントオブジェクトを取得するための呼び出しと同じように、データベースコンテキストオブジェクトが追跡されます。これはあなたの問題を解決するはずです。

関連する問題