C# 如何确保MVC实体在运行时与数据库同步?

C# 如何确保MVC实体在运行时与数据库同步?,c#,asp.net-mvc,entity-framework,asp.net-mvc-4,ef-database-first,C#,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,Ef Database First,我有一个简单的数据库,第一个使用实体框架的MVC应用程序。 我正在视图中使用ViewData.ModelState.IsValid捕获控制器中的任何错误。控制器基于id查询数据库,并基于实体创建对象,然后将其返回给视图 最近,应用程序的用户收到未处理的异常。这被跟踪到一个从数据库表中删除的字段,并且与实体模型不同步(我知道更改管理很糟糕!)。该错误是视图在尝试访问删除的数据字段时引发的,尽管视图认为模型有效 如何确保实体在运行时使用控制器与数据库同步,以便更好地管理错误。 谢谢首先,您必须检查您

我有一个简单的数据库,第一个使用实体框架的MVC应用程序。 我正在视图中使用
ViewData.ModelState.IsValid
捕获控制器中的任何错误。控制器基于id查询数据库,并基于实体创建对象,然后将其返回给视图

最近,应用程序的用户收到未处理的异常。这被跟踪到一个从数据库表中删除的字段,并且与实体模型不同步(我知道更改管理很糟糕!)。该错误是视图在尝试访问删除的数据字段时引发的,尽管视图认为模型有效

如何确保实体在运行时使用控制器与数据库同步,以便更好地管理错误。
谢谢

首先,您必须检查您的实体在您的上下文中是否仍然存在:

existingCaseItem = Context.CaseItems.Where(ci => ci.InventoryItem.Id == caseItem.InventoryItem.Id).FirstOrDefault();
如果
existingcaseetem
null
不同,则它是有效的实体。否则就不行了

了解自上次从数据库中获取新的引用以与您的进行比较以来,是否发生了更改

如果您使用的是WCF,我建议抛出自定义异常:

if (existingCaseItem == null)
{
    throw new FaultException<AtcWcfEntryNotFoundException>(
        new AtcWcfEntryNotFoundException(caseItem.InventoryItem.GetType(),
        caseItem.InventoryItem.Id));
}
if(existingCaseItem==null)
{
抛出新的FaultException(
新的ATCWCentryNotFoundException(caseItem.InventoryItem.GetType(),
caseItem.InventoryItem.Id);
}

您打算如何管理错误?您无法在运行时更改实体,因此我不确定您希望以何种方式进行更改。我不想更改实体的结构。我只想知道它是最新的。另一方面,视图仍然认为模型是有效的,直到它厌倦了意外地访问成员/属性。这就是我试图避免的。我的观点是,如果实体不是最新的,你打算怎么做?您已经收到一个错误,只是可能没有您想要的那么快。如果我知道该实体无效,那么我将为视图设置错误条件,以便优雅地通知用户。当前视图将失败。这不是基于实体创建对象并从数据库中选择记录吗?如果字段不匹配,这将引发一个错误,这是正常的。但由于某种原因,我的不是。你怎么比较?因为如果你使用
==
你会过得很不愉快。您应该重写
Equals
,并实现实体实例之间的比较。您会将其与什么进行比较?创建的对象基于实体。您正在尝试在运行时将模型与数据库同步。所以我真的认为这不管用。在查询数据库之前,您的模型将是有效的。当我调用
Context.CaseItems.Where
时,我正在查询数据库。我收到的信息是最新的。