EntityFramework在转换为基类型时抛出绑定异常

时间:2013-09-17 20:54:34

标签: c# entity-framework asp.net-mvc-4

更新

显然这是我错了。第一个例子实际上并不起作用。我通过序列化对象然后将其反序列化为基类来解决这个问题。


我从实体框架中遇到了一些不一致的问题,我希望有人可以解释为什么。

这有效:

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

的映射和元数​​据信息

这是有道理的,因为您无法更改对象类型,将其强制转换为“隐藏”不属于该子类型的类型。但我不明白的是为什么最上面的一个有效但第二个有效呢?当您进行状态修改时,是否根本不会发生相同的映射检查?

有没有办法仍然能够做到这一点,而不必回复到简单地创建一个新的基本类型并复制所有的字段数据?

2 个答案:

答案 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序列化程序,因为它不需要将类标记为可序列化。我怀疑这是“最好的”解决方案,但它有效且有效。幸运的是,这存在于一块没有性能问题的代码中,所以如果它不是最快的解决方案,它仍然可以。