Asp.net mvc 4 breezejs附加类型问题

Asp.net mvc 4 breezejs附加类型问题,asp.net-mvc-4,asp.net-web-api,breeze,Asp.net Mvc 4,Asp.net Web Api,Breeze,我是breezejs的新手。我试图在客户端定义我的实体类型,而不从服务器获取元数据。我在服务器实体中有一个名为ID的属性 我已使用以下代码将客户端中的命名约定默认为camel大小写 breeze.NamingConvention.camelCase.setAsDefault(); 因此,我开始映射实体,如下所示 store.addEntityType({ shortName: "Photo", namespace: "MyProj.Models",

我是breezejs的新手。我试图在客户端定义我的实体类型,而不从服务器获取元数据。我在服务器实体中有一个名为ID的属性

我已使用以下代码将客户端中的命名约定默认为camel大小写

breeze.NamingConvention.camelCase.setAsDefault();
因此,我开始映射实体,如下所示

store.addEntityType({
        shortName: "Photo",
        namespace: "MyProj.Models",
        dataProperties: {
            id: {
                dataType: DataType.Guid,
                isNullable: false,
                isPartOfKey: true
            },
            title: {
                dataType: DataType.String
            },
            description: {
                dataType: DataType.String
            },
            createdDate: {
                dataType: DataType.DateTime
            },
        }
    });
这一切都很好,除了id字段没有得到正确的值。相反,它具有breeze数据类型ctor设置的默认值,该值等于
Guid.Empty

通过逐步查看breezejs调试脚本,我发现它在来自ajax请求的数据中查找名为
Id
的属性名。但是它找不到它,因为属性是
ID
,所以它将其初始化为
空guid
字符串。我假设通过设置
dataProperty
id
nameOnServer
属性,我将能够修复它

store.addEntityType({
        shortName: "Photo",
        namespace: "MyProj.Models",
        dataProperties: {
            id: {
                dataType: DataType.Guid,
                isNullable: false,
                nameOnServer: 'ID',
                isPartOfKey: true
            },
            title: {
                dataType: DataType.String
            },
            description: {
                dataType: DataType.String
            },
            createdDate: {
                dataType: DataType.DateTime
            },
        }
    });
但它不起作用

进一步挖掘breez.debug.js代码,在第7154行的方法
updateClientServerNames
中,它似乎忽略了我定义的
nameOnServer


我错过了什么吗?

好吧,我觉得我的整个生命都在微风中度过。总之,问题终于解决了。老实说,这在breeze中不是一个问题(但我想知道,当我提供一个时,为什么它不覆盖实际的
nameOnServer
)。这是一个由开发人员在数据库实现的早期阶段(可能是6年前)犯的错误。如果数据库遵循Pascal Case命名约定,那么一切都会非常顺利

作为一个解决方案,我编写了一个自定义命名约定,当名称中有
ID
时,它会纠正命名约定错误,并将其与
camelCase
命名约定相结合

var createInconsistenIDConvention = function () {
var serverPropertyNameToClient = function (serverPropertyName, prop) {

    if (prop && prop.isDataProperty && (prop.nameOnServer && prop.nameOnServer === "ID")) {
        return "id";
    } else {
        var firstSection = serverPropertyName.substr(0, 1).toLowerCase();
        var idSection = "";
        if (serverPropertyName.substr(1).indexOf("ID") != -1) {
            firstSection += serverPropertyName.substr(1, serverPropertyName.substr(1).indexOf("ID")).toLowerCase() + "Id";
        } else {
            firstSection += serverPropertyName.substr(1);
        }

        return firstSection;
    }
}
var clientPropertyNameToServer = function (clientPropertyName, prop) {
    if (prop && prop.isDataProperty && (prop.nameOnServer && prop.nameOnServer.indexOf("ID") != -1)) {
        return prop.nameOnServer;
    } else {
        return clientPropertyName.substr(0, 1).toUpperCase() + clientPropertyName.substr(1);
    }
}
return new breeze.NamingConvention({
    name: "inconsistenID",
    serverPropertyNameToClient: serverPropertyNameToClient,
    clientPropertyNameToServer: clientPropertyNameToServer
});
};
不确定我使用nameOnServer属性的方式是否不正确。我在breeze网站上找不到任何关于这个的文档

请注意,上面的代码只考虑ID、CountryID、GAMID、人物ID等情况:


现在问题解决了。

好吧,感觉我的整个生命都在微风文档中度过。总之,问题终于解决了。老实说,这在breeze中不是一个问题(但我想知道,当我提供一个时,为什么它不覆盖实际的
nameOnServer
)。这是一个由开发人员在数据库实现的早期阶段(可能是6年前)犯的错误。如果数据库遵循Pascal Case命名约定,那么一切都会非常顺利

作为一个解决方案,我编写了一个自定义命名约定,当名称中有
ID
时,它会纠正命名约定错误,并将其与
camelCase
命名约定相结合

var createInconsistenIDConvention = function () {
var serverPropertyNameToClient = function (serverPropertyName, prop) {

    if (prop && prop.isDataProperty && (prop.nameOnServer && prop.nameOnServer === "ID")) {
        return "id";
    } else {
        var firstSection = serverPropertyName.substr(0, 1).toLowerCase();
        var idSection = "";
        if (serverPropertyName.substr(1).indexOf("ID") != -1) {
            firstSection += serverPropertyName.substr(1, serverPropertyName.substr(1).indexOf("ID")).toLowerCase() + "Id";
        } else {
            firstSection += serverPropertyName.substr(1);
        }

        return firstSection;
    }
}
var clientPropertyNameToServer = function (clientPropertyName, prop) {
    if (prop && prop.isDataProperty && (prop.nameOnServer && prop.nameOnServer.indexOf("ID") != -1)) {
        return prop.nameOnServer;
    } else {
        return clientPropertyName.substr(0, 1).toUpperCase() + clientPropertyName.substr(1);
    }
}
return new breeze.NamingConvention({
    name: "inconsistenID",
    serverPropertyNameToClient: serverPropertyNameToClient,
    clientPropertyNameToServer: clientPropertyNameToServer
});
};
不确定我使用nameOnServer属性的方式是否不正确。我在breeze网站上找不到任何关于这个的文档

请注意,上面的代码只考虑ID、CountryID、GAMID、人物ID等情况:


问题暂时解决。

我注释掉了
breeze.NamingConvention.camelCase.setAsDefault()行,并相应地更改了映射详细信息(即,将它们更改为
PascalCase
。这样可以很好地工作。但我希望它能够在javaScript标准
camelCase
上工作。非常感谢您的帮助。我注释掉了
breeze.NamingConvention.camelCase.setAsDefault();
行,并相应地更改了映射详细信息(也就是说,将它们更改为
PascalCase
。这样做很好。但我希望它能在javaScript标准
camelCase
上工作。非常感谢您的帮助。阿米拉,感谢您的评论。我们确实需要更好地记录元数据。即nameOnServer vs name和相关规则。尝试获取一些这方面的信息。)在接下来的几天内,我们将在网站上发布文档,但我们还有很多要补充的内容。:)嗨,杰伊。如果一个人遵循教程,这会有助于理解一些事情,而且,如果我遇到错误,我会在chrome控制台中调试几个小时。这样做有助于我理解大部分内容。事实上,我没有使用上述命名约定,因为我发现从长远来看,在edmx文件中更改它很容易。现在我正在尝试了解如何分配查找(国家/地区列表)当用户点击编辑时动态生成的下拉列表。我认为这是一个淘汰问题,而不是一个breezejs。感谢您提供此解决方案。它忽略了nameOnServer属性,这让我抓狂。我只是希望一切,客户端和服务器,都是camelCase!Amila,感谢您的评论。我们确实需要做得更好记录元数据的作业。例如,nameOnServer vs name和相关规则。试图在未来几天内将部分文档发布到网站上,但我们仍有很多要添加的内容。:)嗨,杰伊。如果一个人遵循教程,这会有助于理解一些事情,而且,如果我遇到错误,我会在chrome控制台中调试几个小时。这样做有助于我理解大部分内容。事实上,我没有使用上述命名约定,因为我发现从长远来看,在edmx文件中更改它很容易。现在我正在尝试了解如何将查找(国家列表)分配给用户单击“编辑”时动态生成的下拉列表。我认为这是一个令人震惊的问题,而不是一个breezejs。感谢您提供此解决方案。它忽略nameOnServer属性让我抓狂。我只想让所有内容(客户端和服务器)都成为现实!