Asp.net mvc 4 展开实体属性

Asp.net mvc 4 展开实体属性,asp.net-mvc-4,knockout.js,breeze,Asp.net Mvc 4,Knockout.js,Breeze,我对微风/击倒非常陌生,但我已经完成了99%的工作。我正在使用热毛巾模板,并通过breeze成功检索项目列表。实体(ITBAL)是数据库第一实体框架实体。当我看到在Fiddler中返回的JSON时,我看到了正确的数据。问题在于data.results的所有属性都依赖于可维护性,而不是原始值本身 我们有一个试图显示data.results数组的自定义网格控件。因为它不期望可观察,所以它只是显示“函数依赖于可观察”而不是值 我试图打开该对象,但不断得到循环参考错误。我不知道为什么,因为ITBAL与任

我对微风/击倒非常陌生,但我已经完成了99%的工作。我正在使用热毛巾模板,并通过breeze成功检索项目列表。实体(ITBAL)是数据库第一实体框架实体。当我看到在Fiddler中返回的JSON时,我看到了正确的数据。问题在于data.results的所有属性都依赖于可维护性,而不是原始值本身

我们有一个试图显示data.results数组的自定义网格控件。因为它不期望可观察,所以它只是显示“函数依赖于可观察”而不是值

我试图打开该对象,但不断得到循环参考错误。我不知道为什么,因为ITBAL与任何东西都没有关联

Fiddler报告的数据如下:

[{"$id":"1","$type":"WebUIHtml5HotTowel.Models.ITBAL, WebUIHtml5HotTowel","IBITNO":"A100                       ","IBWHID":"1 ","IBITCL":"50","IBITSC":"3 ","IBSUSP":" ","IBVNNO":"100   ","IBPRLC":"        ","IBSCLC":"        ","IBCCCD":"P","IBPICD":" ","IBSAFL":"Y","IBSTCS":399.99000,"IBUSCS":0.00000,"IBAVCS":414.95214,"IBLCST":7.00000,"IBLCCC":20.0,"IBLCDT":110923.0,"IBLSCC":20.0,"IBLSDT":130111.0,"IBLXCC":19.0,"IBLXDT":990102.0,"IBMXO1":2100.000,"IBMXO2":0.000,"IBMXO3":0.000,"IBMNO1":5.000,"IBMNO2":0.000,"IBMNO3":0.000,"IBFOQ1":0.000,"IBFOQ2":0.000,"IBFOQ3":0.000,"IBOHQ1":327.000,"IBOHQ2":0.000,"IBOHQ3":0.000,"IBAQT1":1576.000,"IBAQT2":0.000,"IBAQT3":0.000,"IBBOQ1":50.000,"IBBOQ2":0.000,"IBBOQ3":0.000,"IBPOQ1":448.000,"IBPOQ2":0.000,"IBPOQ3":0.000,"IBIQT1":1446.000,"IBIQT2":0.000,"IBIQT3":0.000,"IBRMD1":10.000,"IBRMD2":0.000,"IBRMD3":0.000,"IBRYD1":10.000,"IBRYD2":0.000,"IBRYD3":0.000,"IBISM1":0.000,"IBISM2":0.000,"IBISM3":0.000,"IBISY1":0.000,"IBISY2":0.000,"IBISY3":0.000,"IBAMD1":0.000,"IBAMD2":0.000,"IBAMD3":0.000,"IBAYD1":0.000,"IBAYD2":0.000,"IBAYD3":0.000,"IBMMD1":0.000,"IBMMD2":0.000,"IBMMD3":0.000,"IBMYD1":0.000,"IBMYD2":0.000,"IBMYD3":0.000,"IBSMD1":1.0,"IBSMD2":0.0,"IBSMD3":0.0,"IBSYD1":1.0,"IBSYD2":0.0,"IBSYD3":0.0,"IBBLME":335.000,"IBBLYO":2680.000,"IBBLLY":1441.000,"IBNMTY":8.0,"IBNMLY":11.0,"IBQSMD":21.000,"IBQSYD":21.000,"IBQSLY":20.000,"IBISMD":16318.19,"IBISYD":16318.19,"IBISLY":45714.87,"IBCSMD":373.46,"IBCSYD":373.46,"IBCSLY":67.00,"IBDQMD":0.000,"IBDQYD":0.000,"IBDQLY":0.000,"IBDSMD":0.00,"IBDSYD":0.00,"IBDSLY":0.00,"IBDCMD":0.00,"IBDCYD":0.00,"IBDCLY":0.00,"IBNOMD":18.0,"IBNOYD":18.0,"IBNOLY":18.0,"IBPKMD":15.0,"IBPKYD":15.0,"IBPKLY":14.0,"IBINUS":"        ","IBIAID":0.0,"IBSAID":0.0,"IBCQT1":1527.000,"IBCQT2":0.000,"IBCQT3":0.000,"IBFCST":"Y","IBDRSH":" ","IBWMIU":"JP","IBFL15":"               ","IBUS20":"                    ","IBLPR1":0.00000,"IBLPR2":0.00000,"IBLPR3":0.00000,"IBLPR4":0.00000,"IBLPR5":0.00000,"IBLPCD":" ","IBABCC":"B","IBPRCL":0.0,"IBQBCL":"   ","IBACDC":"Y","IBTDCD":" ","IBDOUM":"   ","IBTP01":0.0,"IBTP02":0.0,"IBTP03":0.0,"IBTP04":0.0,"IBLMCC":20.0,"IBLMDT":130513.0,"IBTMPH":"Y","IBCOMC":" ","IBCOMF":0.00000,"IBITCT":"    ","IBEOQT":0.000,"IBITCM":0.0,"IBBRVW":" ","IBPTID":"  ","IBQTLT":0.0000,"IBCTY1":"AUS","IBCTY2":"AUS","IBTXCD":"1","IBREVS":"Y","IBITXC":"     ","IBMNOQ":0.000,"IBSTUS":0.000,"IBUS30":"                              ","IBPSLN":" ","IBPLIN":"N","IBUPDP":"Y","IBDFII":"2011-08-11T00:00:00.000","IBLHRK":"A","IBPLNC":"          "}]
我的控制器:

    [BreezeController]
public class ItemInquiryController : ApiController
{

    readonly EFContextProvider<AplusEntities> _contextProvider = new EFContextProvider<AplusEntities>();

    [System.Web.Http.HttpGet]
    public string Metadata()
    {
        return _contextProvider.Metadata();
    }

    [HttpGet]
    public IQueryable<ITBAL> ItemBalances(string itemNumber, string warehouse)
    {
        return _contextProvider.Context.ITBALs.Where(i => i.IBITNO == itemNumber && i.IBWHID == warehouse)
                               .OrderBy(i => i.IBWHID)
                               .ThenBy(i => i.IBITNO);


    }

}
我想我一定错过了一些相当简单的东西,但它正在逃避我


更新:我从ApiController中删除了BreezeController属性,它工作正常。

Jon,删除
[Breeze]
属性会有效地禁用你的应用程序的Breeze,因此我认为这不是你问题的长期答案

如果您在这个场景中实际上不需要实体,您只需要数据,那么只提到要在网格中显示的数据的Breeze投影似乎是最佳选择。投影返回的原始数据未包装在KO观测值中,也未保存在Breeze
EntityManager
缓存中

如果您希望数据作为缓存实体,并且还希望在不喜欢可观察属性的网格中显示它们。。。继续读下去

可以使用
KO.toJS
打开KO'd对象。但是,网格可能会抱怨循环引用(或者像某些网格一样抛出“内存不足”异常)。。。即使实体没有循环导航路径。困难源于这样一个事实,即每个Breeze实体通过其
entityAspect
属性具有固有的循环性:

something.entityAspect.entity //'entity' points back to 'something'
ko.toJS
是一个敲除函数,递归地打开对象或对象集合,返回值的副本。然后我们迭代复制的对象图,删除它们的
entityAspect
属性。结果数组被塞进
vm.itbals
可观察并传递

你可以想象如何概括这一点,以消除任何给你带来麻烦的东西

额外的 究竟是什么
vm.totalRecords
?我感觉这应该是分页之前匹配记录的总数。您可以通过将
.inlineCount()
添加到Breeze查询定义中,从Breeze中获得该信息。查询从
data.inlineCount
属性返回后,您将获得该值

您真的需要
vm.itbals()
?如果您在这里所做的只是将值传递给网格,为什么不这样做并删除中间人

下面的成功回调结合了这些思想

function success(data) { var unwrapped = ko.toJS(data.results).map( function(entity) { delete entity.entityAspect; return entity; }); itemBalancesGrid.mergeData(unwrapped, args.pageNum, data.inlineCount); }) 功能成功(数据){ var unwrapped=ko.toJS(data.results.map)( 功能(实体){ 删除entity.entityAspect; 返回实体; }); itemBalancesGrid.mergeData(展开,args.pageNum,data.inlineCount); })
谢谢,沃德!我要试一试。是的,TotalRecords试图获取与inlineCount()相同的内容。我以前尝试过inlineCount(),但它始终返回为未定义。我目前正在通过1到totalRecords,直到我能解决这个问题。沃德,这绝对是个好办法。谢谢inlineCount仍然存在问题,但我怀疑这可能是我的数据提供程序(ProgressDataDirectforDB2)或我们的数据库的问题。错误为SQL0204N:*未找到表类型*中的LIBL.BIGCOUNT。 manager.executeQuery(query).then(success) ... function success(data) { var unwrapped = ko.toJS(data.results).map( function(entity) { delete entity.entityAspect; return entity; }); vm.itbals(unwrapped); vm.totalRecords(1); // huh? What is that "parseInt ..." stuff? itemBalancesGrid.mergeData(vm.itbals(), args.pageNum, parseInt(vm.totalRecords())); }) function success(data) { var unwrapped = ko.toJS(data.results).map( function(entity) { delete entity.entityAspect; return entity; }); itemBalancesGrid.mergeData(unwrapped, args.pageNum, data.inlineCount); })