场合:
我有一个带有SQL Server后端的ASP.NET MVC webapp,它使用Entity Framework进行管理。
我有一个c#类,Entity Framework用它来更新数据库中的实体(duh)。但是,为了让用户实际更新该模型,我将其放在使用Knockout的管理页面上。
当Knockout处理删除时,它会向Javascript对象添加_destroy
属性,并对特定ASP.NET MVC控制器中的Update
方法进行AJAX调用。要检索此_destroy
属性,我有第二个C#类,它只是继承第一个,并添加_destroy
作为可以为空的bool属性。
问题:
当我尝试将此加密对象传递回Entity Framework以更新(或删除)实体时,它会引发异常:
实体类型Foo不是当前上下文的模型的一部分
实体框架并不知道这个继承的类(并且它不应该只在web-app中有意义),但它不会只使用基类'用于执行更新的属性。
问题:
我是否需要重新设计如何将此继承对象传递给EF?是否可以保存此更新的实体?
除了复制我的基类以及添加的_destroy
可空的bool并投射它之外,还有其他选择吗? (代码味)
示例:
bar.cs
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
}
myentityframeworkabstraction.cs
...
_context.Entry(updatebars).CurrentValues.SetValues(updatebars);
await _context.SaveChangesAsync(token);
...
_context.Set<Bar>().RemoveRange(deletebars);
await _context.SaveChangesAsync(token);
...