1

更新

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


我从 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 时,是否根本不会发生相同的映射检查?

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

4

2 回答 2

3

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

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

于 2013-09-23T19:32:13.367 回答