1

これが簡単なものだといいのですが。

EntityFramework4.1でのMVC4の使用。

カスタムビューモデルのプロパティを使用して、ビューから渡されたいくつかのプロパティを使用してモデルを更新しようとしています。

私はこのクラスを持っています。

public class SitePage
{
    public System.Guid PageID { get; set; }
    public int PageTypeID { get; set; }
    public string PageTitle { get; set; }
    public Nullable<int> RegionId { get; set; }
    public Nullable<int> LockLevelId { get; set; }
    public System.DateTime UpdatedDate { get; set; }
    public System.Guid UpdatedById { get; set; }
    public System.Guid CreatedById { get; set; }
    public System.DateTime CreatedDate { get; set; }
    public string Url { get; set; }
    public int PageStateId { get; set; }
    public string SummaryImage { get; set; }

}

私のコントローラー

public ActionResult Update(AddPageViewModel model)
{
 if (ModelState.IsValid)
{
  var g = new Guid(model.PageId);
  SitePage UpdatePage = dbSite.SitePages.FirstOrDefault(m => m.PageID == g);

           //This is a page update. Not updating all properties
            UpdatePage.PageTitle = model.PageTitle;
            UpdatePage.GetFirstSection.PageSectionText.PageText = model.PageText;
            UpdatePage.PageTypeID = (int)SitePageType.PageTypes.CommunityPage;
            UpdatePage.RegionId = model.Region
            UpdatePage.CreatedById = userId;
            UpdatePage.CreatedDate = DateTime.UtcNow;
            UpdatePage.UpdatedById = userId;
            UpdatePage.UpdatedDate = DateTime.UtcNow;

 TryUpdateModel(UpdatePage);
 dbSite.Save();

 return RedirectToAction("Community_test", "Community", new { id = UpdatePage.Url });

}
else
{
     return RedirectToAction("Community_test", "Community");
}
}

このページビューモデルをコントローラーに渡す

public class AddPageViewModel
{
   public string PageTitle { get; set; }
   public string PageText { get; set; }
   public int Region { get; set; }
   public string TagString { get; set; }
   public string ParentPageId { get; set; }
   public string PageId { get; set; }
}

デバッグすると、TryUpdateModelが呼び出されたときにSitePageインスタンスUpdatePageにすべての正しい値があることがわかります。ただし、RegionIdを除くすべての値はデータベースで正しく更新されます。RegionIdはnullとして設定されます。サーバーでトレースを実行すると、SQLエンティティフレームワークが生成するのは、モデルに値がある場合でも、RegionIdをnullに設定していることです。この問題は断続的です!動作する場合もあれば、動作しない場合もあります。4人に1人は正しく更新され、どこがうまくいかないのかよくわかりません。私は本当にこのようなものに慣れていません。

クラスはデータベースから生成され、edmxファイルを使用しています。次回データベースからモデルを更新するときに、これらのクラスをオーバーライドせずに、これらのクラスに変更を加えることができるかどうかはわかりません。

必要なアイデアや詳細情報があれば、私に一言お願いします。乾杯

4

1 に答える 1

1

TryUpdateModelはフォームから値を取得し、指定されたモデルにデータを入力します。これは、に値を設定するUpdatePage必要がないことを意味します。

if (ModelState.IsValid)
{
    var updatePage = dbSite.SitePages.FirstOrDefault(m => m.PageID == model.PageId);

    TryUpdateModel(updatePage);
    dbSite.Save();

    //...
}

更新する必要のあるプロパティも指定することをお勧めします。

TryUpdateModel(updatePage, new string[] { "PageTitle", "RegionId", etc.. });

RegionIdがNullに設定されることについて。

デバッグすると、TryUpdateModelが呼び出されたときにSitePageインスタンスUpdatePageにすべての正しい値があることがわかります。

TryUpdateModelに呼び出されるか、直後に呼び出されますか?

于 2012-06-19T16:44:25.670 に答える