C# TryUpdateModel使用MVC4和实体框架在插入时将属性设置为null,即使指定了值
我希望这是一个简单的问题 在实体框架4.1中使用MVC4 我正在尝试使用从具有自定义视图模型属性的视图传递的某些属性更新模型 我有这门课C# TryUpdateModel使用MVC4和实体框架在插入时将属性设置为null,即使指定了值,c#,asp.net-mvc,entity-framework,entity-framework-4.1,asp.net-mvc-4,C#,Asp.net Mvc,Entity Framework,Entity Framework 4.1,Asp.net Mvc 4,我希望这是一个简单的问题 在实体框架4.1中使用MVC4 我正在尝试使用从具有自定义视图模型属性的视图传递的某些属性更新模型 我有这门课 public class SitePage { public System.Guid PageID { get; set; } public int PageTypeID { get; set; } public string PageTitle { get; set; } public Nullable<int>
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。这个问题是间歇性的!有些时候它起作用,有些时候不起作用。1/4将正确更新,我看不出我哪里出了问题。我对这东西真的很陌生
我们的类是从数据库生成的,我们使用的是edmx文件。我不确定我是否可以对这些类进行任何更改,而不让它们在下次从数据库更新模型时被覆盖
如果需要任何想法或更多信息,请告诉我。CheersTryUpdateModel从表单中获取值并填充给定模型。这意味着无需在
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
之前或之后?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
之前或之后?除了PageTitle
之外,TryUpdateModel
如何设置他正在手动设置的其他属性?CreatedDate和UpdateDate可以放入类中。可以通过稍微调整ViewModel来设置Rest。在任何情况下,手动设置属性和使用TryUpdateModel似乎都有点重复,即使他正在填充不同的属性。我已经设法解决了这个问题,主要是因为这个答案帮助我看到了哪里出了问题,所以我将此标记为答案。我的问题是,我不知道TryUpdateModel从表单中获取了值,所以我试图在我的类中用视图模型中的(int)Region手动设置(int)RegionId,但是在我的SitePage类中,我也有(Region)Region,所以我认为TryUpdateModel试图用视图模型中的Region(int)设置Region(Region),因此得到了空值。Iv将我的viewmodel区域重命名为RegionId,一切正常。我是新来的,开始意识到EF有多聪明,并更加注意命名约定。感谢大家的帮助。除了PageTitle
之外,TryUpdateModel
如何设置他正在手动设置的其他属性?CreatedDate和UpdateDate可以放入类中。可以通过稍微调整ViewModel来设置Rest。在任何情况下,手动设置属性和使用TryUpdateModel似乎都有点重复,即使他正在填充不同的属性。我已经设法解决了这个问题,主要是因为这个答案帮助我看到了哪里出了问题,所以我将此标记为答案。我的问题是,我不知道TryUpdateModel从表单中获取了值,所以我试图在我的类中用视图模型中的(int)Region手动设置(int)RegionId,但是在我的SitePage类中,我也有(Region)Region,所以我认为TryUpdateModel试图用视图模型中的Region(int)设置Region(Region),因此得到了空值。Iv将我的viewmodel区域重命名为RegionId,一切正常。我是新来的,开始意识到EF有多聪明,并更加注意命名约定。谢谢你们的帮助。