0

関連するテーブルが 3 つあります。カレンダー 1...* CalendarUser *...1 ユーザー。編集カレンダー ビューで CalendarUsers を編集したら、ViewModel をコントローラーに戻します。これが私のコントローラーコードです:

    [HttpPost]
    public ActionResult Edit(int id, CreateCalendarViewModel cvm)
    {
        long userId = long.Parse(User.Identity.Name);

        db.Calendars.Attach(cvm.CurrentCalendar);
        cvm.Users= DbExtensions.GetUserList(userId);

        if (ModelState.IsValid)
        {
            ////Remove the deselected users
            cvm.CurrentCalendar.CalendarUsers.Clear();

            //Get the names from the selected users
            var selectedUsers = from u in cvm.Users
                                where cvm.SelectedUsers.Contains(u.Key)
                                select new KeyValuePair<long, string>(long.Parse(u.Key), u.Value);

            foreach (var selectedUser in selectedUsers)
            {

                User user = db.Users.Find(selectedUser.Key);

                //If usr does not exist create a new
                if (user == null)
                {
                    db.Users.Add(new User
                    {
                        UserId = selectedUser.Key,
                        Name = selectedUser.Value,
                        Expires = DateTime.Now,
                        AccessToken = string.Empty
                    });
                }

                //Add the binding to the calendar
                cvm.CurrentCalendar.CalendarUsers.Add(new CalendarUser
                {
                    CalendarId = cvm.CurrentCalendar.CalendarId,
                    UserId = selectedUser.Key
                });
            }

            db.Entry(cvm.CurrentCalendar).State = EntityState.Modified;

            db.SaveChanges();

        }

        return View(cvm);
    }

ここに私のクラスがあります:

public partial class Calendar 
{ 
    public Calendar() 
    { 
        this.CalendarUsers = new HashSet<CalendarUser>(); 
    } 

    public int CalendarId { get; set; } 
    public string CalendarTitle { get; set; } 
    public string CalendarDescription { get; set; } 
    public long UserId { get; set; } 

    public virtual User User { get; set; } 
    public virtual ICollection<CalendarUser> CalendarUsers { get; set; } 
} 

public partial class CalendarUser 
{ 
    public int CalendarUserId { get; set; } 
    public int CalendarId { get; set; } 
    public long UserId { get; set; } 
    public Nullable<bool> IsAdmin { get; set; } 

    public virtual Calendar Calendar { get; set; } 
    public virtual User User { get; set; } 
} 

public partial class User 
{ 
   public User() 
   { 
       this.Calendars = new HashSet<Calendar>(); 
       this.CalendarUsers = new HashSet<CalendarUser>(); 
   } 

   public long UserId { get; set; } 
   public string Name { get; set; } 

   public virtual ICollection<Calendar> Calendars { get; set; } 
   public virtual ICollection<CalendarUser> CalendarUsers { get; set; } 
} 

何らかの理由で変更を保存すると、カレンダーも削除されますか? 少し調べてみたのですが、同じ症状の人はいませんか?私はそれを間違っていますか?関連エンティティを更新/削除するより良い方法はありますか?

4

1 に答える 1

1

ユーザーのIDを含むビューに非表示フィールドを含めるのを忘れたようです。その結果、カレンダーを更新すると、Id = 0で保存され、指定されたユーザーのビュー内のオブジェクトが非表示になりました。メンタルノート:データベースで実際に何が起こっているかを常に確認してください。

また、ビューとコントローラーの間でオブジェクトをやり取りするときに何が起こっているかを調べる必要があります。自分で管理しているように見えることもあれば、すべてのフィールドを自分で指定する必要があることもあります。

于 2012-06-01T11:06:01.267 に答える