实体框架在强制转换为基类型时引发绑定异常

本文关键字:类型 异常 绑定 基类 框架 转换 实体 | 更新日期: 2023-09-27 18:31:46

更新

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


我在实体框架中遇到了一些不一致的问题,希望有人能阐明原因。

这有效:

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);
    }
}

引发的异常是:

消息:找不到实体类型订单调查视图模型的映射和元数据信息

这是有道理的,因为您无法更改对象类型,强制转换它只会"隐藏"不属于该子类型的类型。但我不明白的是,为什么第一个有效,而第二个不起作用?当您执行条目状态修改时,是否根本不会发生相同的映射检查?

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

实体框架在强制转换为基类型时引发绑定异常

EF

抱怨缺少映射数据,这意味着您没有将实体 OrderSurveyViewModel 映射到数据库中的表。检查 EF 模型视图 (.edmx) 并验证映射是否已正确定义。

如我的更新中所述,此代码不起作用,这是我的最终解决方案:

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

相关文章: