单页应用程序,upshot.js,DbContext和DbDataController:仅支持实体模型?

Ste*_*ath 7 entity-framework viewmodel asp.net-mvc-4 upshot knockout.js

使用单页应用程序的示例时​​,我有以下TodoItem控制器:

public partial class MVC4TestController : DbDataController<MVC4TestContext>
{
    public IQueryable<TodoItem> GetTodoItems()
    {
        return DbContext.TodoItems.OrderBy(t => t.TodoItemId);
    }
}
Run Code Online (Sandbox Code Playgroud)


问题1:
似乎只支持EntityModels?
当使用真正的ViewModel(仅用于视图的模型,而不是用作1:1映射到数据库实体)时,DbDataController不支持此功能.

使用Linq.TranslationsPropertyTranslator似乎也不起作用,请参阅此代码提取:

private static readonly CompiledExpressionMap<TodoItem, string> fullExpression =
    DefaultTranslationOf<TodoItem>.Property(t => t.Full).Is(t => t.Title + "_" + t.IsDone);

public string Full
{
    get
    {
        return fullExpression.Evaluate(this);
    }
}
Run Code Online (Sandbox Code Playgroud)


问题2:
使用SPA,DBContext和ViewModels时的推荐设计是什么?

Obi*_*007 3

据我所知,到目前为止 - 它坚持使用绑定到 DbContext 的“真实”模型类。我有和你一样的问题 - 我需要使用我自己的“扁平”DTO 对象。Json序列化目前无法序列化子对象中具有父引用(循环引用)的数据。通常我无论如何都不需要实体树,所以我创建了更小的类,非常适合视图。我尝试使用带有 JsonResult 的普通控制器,并在检索数据后将返回的模型解析为 ko.mapping.fromJS 。那工作得很好。但是 - 您必须处理 MVC4 生成的视图模型已经处理的所有好东西(例如创建导航等)。也许有人找到了一种解决方法,可以用 DTO 数据“伪造”DbContext。

  • 经过更多实验:只要您有一个标记为 [Key] 的 Id 映射属性,您就可以使用自己的 DTO 对象。但为了搭建这些东西,你需要有一个“真正的”基于数据库的模型。生成控制器和视图内容后,您可以轻松地将 DBController 内容替换为您自己的 DTO,并根据需要创建数据。但当然,您不能在 DbController 的 Update/Insert 辅助方法中使用 DbContext。 (2认同)