更新
显然这是我错了。第一个例子实际上并不起作用。我通过序列化对象然后将其反序列化为基类来解决这个问题。
我从实体框架中遇到了一些不一致的问题,我希望有人可以解释为什么。
这有效:
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
的映射和元数据信息
这是有道理的,因为您无法更改对象类型,将其强制转换为“隐藏”不属于该子类型的类型。但我不明白的是为什么最上面的一个有效但第二个有效呢?当您进行状态修改时,是否根本不会发生相同的映射检查?
有没有办法仍然能够做到这一点,而不必回复到简单地创建一个新的基本类型并复制所有的字段数据?
答案 0 :(得分:3)
EF抱怨缺少映射数据,这意味着您没有将实体OrderSurveyViewModel映射到数据库中的表。检查EF模型视图(.edmx)并验证映射是否正确定义。
答案 1 :(得分:1)
如我的更新中所述,此代码不起作用,这是我的最终解决方案:
public ActionResult Edit(ProductViewModel model) {
if (ModelState.IsValid)
{
var product = JsonConvert.DeserializeObject<Product>(JsonConvert.SerializeObject(model));
Database.Entry(product).State = EntityState.Modified;
Database.SaveChanges();
}
return View(model);
}
这使用了Newtonsoft的JSON序列化程序,因为它不需要将类标记为可序列化。我怀疑这是“最好的”解决方案,但它有效且有效。幸运的是,这存在于一块没有性能问题的代码中,所以如果它不是最快的解决方案,它仍然可以。