更新
显然这只是我错了。第一个示例实际上不起作用。我通过序列化对象然后将其反序列化为基类来解决这个问题。
我从 Entity Framework 中遇到了一些不一致的问题,希望有人能解释一下原因。
这有效:
public class ProductViewModel : Product {
// Adds some select lists for View
}
public ActionResult Edit(ProductViewModel model) {
if (ModelState.IsValid)
{
// Casting model to base type, EF has no issues.
var product = (Product)model;
Database.Entry(product).State = EntityState.Modified;
Database.SaveChanges();
}
return View(model);
}
但是,这不起作用:
public class OrderSurveyViewModel : tblSurvey {
// adds select lists as ProductViewModel does
}
public ActionResult OrderSurvey(OrderSurveyViewModel model) {
if(ModelState.IsValid){
// throws exceptions
var survey = (tblSurvey)model;
Database.tblSurvey.Add(survey);
}
}
抛出的异常是:
消息:找不到 EntityType OrderSurveyViewModel 的映射和元数据信息
这是有道理的,因为您无法更改对象类型,将其强制转换只是“隐藏”不属于该子类型的类型。但是我不明白为什么第一个有效而第二个无效?当您进行 Entry State Modified 时,是否根本不会发生相同的映射检查?
有没有办法仍然能够做到这一点,而不必恢复为简单地创建新的基本类型并复制所有字段数据?