0
votes

I'm trying to set up breeze and I can't get entities to correctly fill out their data properties (that I defined in metadata). When I execute a query, all of the data properties for the entity are mapped to ... instead of what was returned by my server (data verified by checking the response with chrome developer tools). If I click the ... it resolves to the default value of that property (usually null or ""). My question is: Why does Breeze seemingly understand its supposed to create an entity from the query results, but doesn't fill in the data properties for that created entity from the same results? Is there another step to resolving the data?

Below is all my relevant code for setting this up. I'm hoping someone can spot something I forgot or did wrong and let me know how to get this working as I've been stumped for a couple days.


In my routes file

breezeMongo = require('breeze-mongodb')
database    = require '../database'

server.get "/v1/event", (req, res) ->
    query = new breezeMongo.MongoQuery(req.query)

    database (err, db) ->
        query.execute db, "events", (err, _event) ->
            if not err
                res.setHeader("Content-Type:", "application/json")
                res.send _event

            else res.send 404

Metadata Factory

angular.module('metadata', [])
    # create a new metadataStore and define metadata
    .factory 'metadataManager', (breeze) ->
        createMetadataStore = ->
            store = new breeze.MetadataStore()
            fillMetadataStore(store)

            return store

        fillMetadataStore = (store) ->
            namespace = 'uTourney'
            keyGen    = breeze.AutoGeneratedKeyType.None
            helper    = new breeze.config.MetadataHelper(namespace, keyGen)
            addType   = (type) -> helper.addTypeToStore store, type

            DATE = DT.DateTime
            ID   = DT.MongoObjectId

            addType {
                name: 'Event'
                defaultResourceName: 'event'
                dataProperties:
                    _id:           { type: ID, isPartOfKey: true }
                    address:       { complex: 'Address', required: true }
                    admins:        { type: ID, isPartOfKey: true, hasMany: true }
                    creator:       { type: ID, isPartOfKey: true }
                    date_finished: { type: DATE }
                    date_started:  { type: DATE }
                    description:   { max: 2000, isNullable: true }
                    summary:       { max: 140,  isNullable: true }
                navigationProperties:
                    maker:
                        entityTypeName: "User"
                        associationName: "event_creator"
                        foreignKeyNames: [ 'creator' ]
            }

        return { newStore: createMetadataStore }

EntityManager Factory and Service

angular.module('Breeze', ["metadata", "breeze.angular"])
    # emFactory initializes dataservice and metadataStore for BreezeService
    .factory 'emFactory', (breeze, metadataManager) ->
        breeze.NamingConvention.camelCase.setAsDefault()
        breeze.config.initializeAdapterInstance "dataService", "mongo", true

        dataService = new breeze.DataService
            serviceName: 'http://localhost:9001/v1'
            hasServerMetadata: false

        metadataStore = metadataManager.newStore()
        metadataStore.addDataService(dataService)

        return {
            serviceName: dataService.serviceName
            newManager: -> return new breeze.EntityManager(dataService: dataService, metadataStore: metadataStore)
        }

    # BreezeService get injected into client-side controllers
    .factory 'BreezeService', (breeze, emFactory) ->
        manager = emFactory.newManager()
        EntityQuery = breeze.EntityQuery

        getEvents = (next) ->
            query = new EntityQuery('Event')

            success = (data) -> next null, data.results
            failed  = (err)  -> next err

            manager
                .executeQuery(query)
                .then(success)
                .catch(failed)

        return { getEvents: getEvents }

Breeze included when my app starts

# My app includes the Breeze module which also pulls in breeze.angular 
app = angular.module("uTourney", ["services", "directives", "filters", "config", "Breeze"])
    .run( ['$rootScope', 'breeze', ($rootScope, breeze) ->
        # ...
    ])

Client-side controller

window.EventListCtrl = ($scope, BreezeService) ->
    $scope.events = []

    BreezeService.getEvents (err, events) ->
        $scope.events = events
        console.log '$scope.events', $scope.events

Console output

$scope.events [Object, Object]
        0: Object
            $$hashKey: "00D"
            _backingStore: Object
            _id: (...)
            address: (...)
            admins: (...)
            creator: (...)
            date_finished: (...)
            date_started: (...)
            description: (...)
            maker: (...)
            entityAspect: ctor
            name: (...)
            summary: (...)
        1: Object
            $$hashKey: "00E"
            _backingStore: Object
            _id: (...)
            address: (...)
            admins: (...)
            creator: (...)
            date_finished: (...)
            date_started: (...)
            description: (...)
            maker: (...)
            entityAspect: ctor
            name: (...)
            summary: (...)
1
Well I figured out that I had an unnecessary breeze.NamingConvention.camelCase.setAsDefault() that was messing everything up. Deleted that line and everything is smooth.Justen
Done this to myself several times. You can guard against it by first creating the metadataStore with the convention you want and then building it out.Ward
Would you mind closing this out with an "answer" so we don't think it is still open? Thanks.Ward

1 Answers

1
votes

Because of the way my data model is set up, the breeze.NamingConvention.camelCase.setAsDefault() in my emFactory definition was causing my data properties to translate incorrectly when switching between client and server.