C# 继承的类不是实体框架模型的一部分

C# 继承的类不是实体框架模型的一部分,c#,asp.net-mvc,entity-framework,knockout.js,C#,Asp.net Mvc,Entity Framework,Knockout.js,情况: 我有一个带有SQL Server后端的ASP.NET MVC webapp,它使用实体框架进行管理 我有一个c类,实体框架使用它来更新数据库duh中的实体。然而,为了让用户真正更新该模型,我将其放在使用Knockout的管理页面上 当Knockout处理删除时,它向Javascript对象添加一个_destroy属性,并对特定ASP.NET MVC控制器中的更新方法进行AJAX调用。为了检索这个_destroy属性,我有了第二个C类,它简单地继承了第一个C类,并将_destroy添加为可

情况:

我有一个带有SQL Server后端的ASP.NET MVC webapp,它使用实体框架进行管理

我有一个c类,实体框架使用它来更新数据库duh中的实体。然而,为了让用户真正更新该模型,我将其放在使用Knockout的管理页面上

当Knockout处理删除时,它向Javascript对象添加一个_destroy属性,并对特定ASP.NET MVC控制器中的更新方法进行AJAX调用。为了检索这个_destroy属性,我有了第二个C类,它简单地继承了第一个C类,并将_destroy添加为可为空的bool属性

问题:

当我试图将此inhered对象传递回Entity Framework以更新或删除该实体时,它会引发一个异常:

实体类型Foo不是当前上下文模型的一部分

Entity Framework不知道这个继承的类,也不应该知道,它只在web应用程序中有意义,但它不会仅使用基类的属性来执行更新

问题:

我是否需要重新设计如何将此继承对象传递给EF?是否可以保存此更新的实体

除了用添加的_destroynullable bool复制我的基类并强制转换它之外,还有其他选择吗?代码气味

例如:

酒吧

 public class Bar
 {
     public int Id { get; set; }
     public string SomeOtherProperty { get; set; }
 }
foo.cs

 public class Foo : Bar
 {
     public bool? _destroy { get; set; }
 }
MyController.cs

public async Task<JsonResult> Update(CancellationToken token, params Foo[] foos)
{
    var deletefoos = foos.Where(x => x._destroy.HasValue && x._destroy.Value).Select((Bar b) => b).ToArray();
    await _myEntityFrameworkAbstraction.DeleteAllTheseFoosAsync(token, deletefoos);

    //similar update call
}
MyEntityFrameworkStrAction.cs

...
_context.Entry(updatebars).CurrentValues.SetValues(updatebars);
await _context.SaveChangesAsync(token);
...
_context.Set<Bar>().RemoveRange(deletebars);
await _context.SaveChangesAsync(token);
...

就我个人而言,我会让你的实体完全远离web应用程序,而使用视图模型。使用包含而不是继承如何。使用你拥有的代码或foos有什么问题吗?Where.Cast?@IvanStoev这可能有效,我会尝试一下。。。不知道为什么我以前没想到。公共条实体{get;set;}这看起来很容易,但会造成伤害。DavidG的建议伤害较小,但如果你有更大、更复杂的模型,效果会更好。就我个人而言,我会让你的实体完全远离web应用程序,而使用视图模型。使用包含而不是继承如何。使用你拥有的代码或foos.Where.Cast?@IvanStoev那可能行得通,我来试试。。。不知道为什么我以前没想到。公共酒吧BarEntity{get;set;}看起来很容易受伤。戴维格的建议伤害较小,但如果你有更大更复杂的模型,效果会更好。