0

这与以下问题有关: BreezeJS Selecting ComplexType properties

所以:

public class Person {
   public int Id {get;set;}
   public string Name {get;set;}
   public Address MyAddress {get;set;}
   public virtual ICollection<Pet> Pets {get;set;}
}

我想打电话

EntityQuery.from('Person').select('id,name,pets').orderBy('id');

并映射到personBrief对象。

我知道有一个:

.toType("personBrief") 

扩展名,但它似乎没有“找到具有该描述的对象”(我在哪里可以定义这个?),并且在线帮助说不支持复杂类型。

然后我尝试了Jumpstart HotTowel 教程中的mapDtosToEntities()函数

此方法似乎仅成功映射非数组属性。从 Breeze 查询返回的 Dto 具有正确填充的宠物集合。我尝试将它们循环推送到ko.observableArray但事件虽然它填充了我的新实体,但微风失败并出现“可能未设置集合导航属性”错误。

最后,我想在初始化程序中创建一个 Computed 。

personBrief.sumOfPetAges = ko.computed(function() {
            var sum = 0;

            person.pets().forEach(function (i) {
                sum += i.petAge();
            });
            return sum;
        });

知道如何在投影后保留对象图吗?谢谢

4

1 回答 1

0

您是否定义PersonBrief为 EntityType?我打赌不会……特别是考虑到您在示例中将其称为“personBrief”。该toType()方法用于转换一个简单的、扁平的、已知的 EntityType。所以我认为你在这里有点偏离轨道。

为什么不投到Person?确实缺少一些 Person 材料(如在 CCJS 中......虽然在这个您投影所有数据属性的特定示例中没有)。但这非常简单。就写吧toType('Person')。你试过吗?

如果您确实在客户端上定义这样的 EntityType,您可以按照文档中的说明进行操作。如果你这样做,你可以使用该toType()类型的强制转换,Breeze 将在缓存中跟踪它。当然,将这样的东西保存回服务器是另一回事。这是可行的......它可能是一种DTO......但你必须在服务器上编写拦截逻辑并将数据转换为真实的服务器端持久实体,这条路径超出了我的回答范围.

这是一些代码...写在我的脑海中...但它应该为您指明正确的方向。请注意,我假设它Pet是 EntityType,而不是 ComplexType!目前 Breeze 不支持 ComplexTypes 数组(支持但现在不支持)。

   // 为给定的 MetadataStore 定义 PersonBrief 类型
   函数 addPersonBriefType(metadataStore) {
        var perType = metadataStore.getEntityType('Person');

        var 类型 = 新微风.EntityType({
            shortName: 'PersonBrief',
            命名空间:perType.namespace
        });
        var idProperty = 新的微风.DataProperty({
            nameOnServer: 'Id',
            数据类型:微风.DataType.Int32,
            isPartOfKey:真,
        });
        type.addProperty(idProperty);
        type.addProperty(新微风.DataProperty({ nameOnServer:'Name'}));

        // 这里是你如何定义你的 Pets 集合
        // 我假设你已经在元数据中有一个 Pet 类型并且
        // 它有一个反向导航返回到 Person
        // 获取从 Person 到 Pets 的导航属性
        var assoc = perType.getNavigationProperty('Pets');

        type.addProperty(新的微风.NavigationProperty({
            nameOnServer: '宠物',
            isScalar: false, // 它是一个集合
            entityTypeName: assoc.entityType.name,
            foreignKeyNames: assoc.inverse.foreignKeyNames,
            关联名称: assoc.associationName
        }));

        metadataStore.addEntityType(type);
        返回类型;
    }

我能够在 DocCode 示例EmployeePartialmetadataTests.jsPets中执行类似的操作,其中等效于is Orders。可比较的投影查询是这样的:

var 查询 = 微风.EntityQuery.from('Employees')
    .where('EmployeeID', 'eq', 1)
    .select('EmployeeID, FirstName, LastName, Orders')
    .toType('EmployeePartial')

您的sumOfPetAges计算应该可以工作,因为有一种PersonBrief类型需要补充。

可以肯定的是,我自己正在飞行。我知道它可以工作,即使我不能对我在这里编写的这段特定代码发誓。让我们知道这对您有何影响。

ps 虽然您应该能够从 to 导航PersonBriefPets但不要期望从 a 导航回Peta PersonBrief;该导航属性未定义。

于 2013-05-22T02:36:06.310 回答