Asp.net mvc 4 不带EF的MVC SPA:必须编写一个属性';类型'=';对象';使用本地名称写入属性后'__类型';

Asp.net mvc 4 不带EF的MVC SPA:必须编写一个属性';类型'=';对象';使用本地名称写入属性后'__类型';,asp.net-mvc-4,singlepage,Asp.net Mvc 4,Singlepage,所以我有一个非常规范化的模型,我正试图在MVC4中创建一个单页应用程序,它希望使用实体框架对象。我的问题是我无法在EF中创建一个具有我需要的复杂映射的实体(我已经检查了多个指南,但我似乎无法从包含不同主键的多个表中创建一个实体……我找到了一个使用可更新视图的解决方案,但这实际上只是将抽象向下推到了db层) 因此,我认为我可以使用EF查询创建一个POCO对象来创建该对象,然后在insert/update/delete上,我可以只获取POCO数据并更新底层的3个表 好吧,我遇到了一个障碍,只是想调整

所以我有一个非常规范化的模型,我正试图在MVC4中创建一个单页应用程序,它希望使用实体框架对象。我的问题是我无法在EF中创建一个具有我需要的复杂映射的实体(我已经检查了多个指南,但我似乎无法从包含不同主键的多个表中创建一个实体……我找到了一个使用可更新视图的解决方案,但这实际上只是将抽象向下推到了db层)

因此,我认为我可以使用EF查询创建一个POCO对象来创建该对象,然后在insert/update/delete上,我可以只获取POCO数据并更新底层的3个表

好吧,我遇到了一个障碍,只是想调整一个现有的工作控制器,试图了解发生了什么

让我们想象一下,我有一个工作的水疗控制器,看起来像这样:

public partial class FooController : DbDataController<aspnetEntities> 
{    
    public IQueryable<Foos> GetFoos() { ... }    
}
公共部分类FooController:DbDataController
{    
公共IQueryable GetFoos(){…}
}
我只是稍微修改一下,以返回我的新POCO数据对象栏,让我们想象一下,目前它与Foo具有完全相同的字段:

public partial class FooController : DbDataController<aspnetEntities>
{
    public IQueryable<Bars> GetBars() { ... }
}
公共部分类FooController:DbDataController
{
公共IQueryable GetBars(){…}
}
在FooViewModel.js中,我将操作名更新为getbar,并从

var entityType=“Foo:#Models”

var entityType=“Bar:#Models”

我直接点击我的操作,我得到:

旧的
true

新的
true

控制器看起来像是给了我我所期望的,但是当我试着把所有的东西放在一起的时候,SPA闪烁起来:

在使用本地名称“\uuu type”写入属性后,必须写入属性“type”=“object”


我猜我需要把类型数据输入KO?我不确定它可能在哪里,然而,我已经在JS中爬行了几个小时,但我甚至不清楚它在哪里失败。非常感谢您的任何意见。

您遇到的问题与您使用POCO而不是标准EF有关。它应该与webapi序列化程序相关,而webapi序列化程序不知何故无法将该类识别为可序列化的。无论如何,这是一个将在RC中删除的bug。请查看此线程的解决方法:

您确定要编辑、显示等的各种方法中没有旧实体的轨迹吗__类型是添加到存储其类型的实体的属性,因此…可能发现了某种类型不匹配。Francesco,可能有,但在GetBars()方法上没有,但我不清楚JS框架是否从服务获取元数据?如果是这样的话,我也不确定它在哪里这样做。我想事实上我对水疗的了解还不够,但这是我一直坚持的技术,所以我尝试着用我的方式来解决它。谢谢你提供的信息。谢谢,这很令人沮丧,但至少我感觉不那么糟糕。在上下文中显式禁用代理创建为我解决了问题。例如,context.Configuration.ProxyCreationEnabled=false;希望有帮助!这是我提供的链接中列出的可能的解决方法之一…您可以将其用作解决方法…但一般来说,这是不可接受的。最好避免在IQueryable中使用DTL类进行选择并将其数据复制到实体的ViewModel版本中。我总是这样做,以保持数据层与表示层分离。问题是代理是一个子类,而序列化程序…如果子类未声明为已知类型,则不会序列化子类