Breeze错误:无法通过名称找到“类型”:'' - 首先调用fetchMetadata

时间:2013-08-06 15:30:58

标签: angularjs asp.net-web-api breeze

我正在尝试使用Breeze和web api将新项目保存到我的数据库。

这是我的模特:

 public class MuscleGroup
    {

        #region Properties

        public int MuscleGroupId { get; set; }

        public string Name { get; set; }

        public string Description { get; set; }

        public string ImageUrl { get; set; }
        #endregion

        #region Navigational properties

        public virtual ICollection<Muscle> Muscles { get; set; }

        public virtual ICollection<Exercise> Exercises { get; set; }



        #endregion
    }

这是我的API:

[BreezeController]
    public class MuscleGroupController : ApiController
    {
        private readonly EFContextProvider<MadBarzDatabaseContext> _contextProvider =
            new EFContextProvider<MadBarzDatabaseContext>();


        // GET api/<controller>
        [HttpGet]
        public IQueryable<MuscleGroup> Get()
        {
            return _contextProvider.Context.MuscleGroups;
        }

        [HttpPost]
        public SaveResult SaveChanges(JObject saveBundle)
        {
            return _contextProvider.SaveChanges(saveBundle);
        }
    }

以下是我的dataService.js的一部分:

app.angularModule.service('muscleGroupService', function(breeze, logger) {


    breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true);

    var mbservice = new breeze.DataService({
        serviceName: "http://localhost:23758/api/MuscleGroup",
        hasServerMetadata: false,
    });

    var manager = new breeze.EntityManager({ dataService: mbservice });

    manager.enableSaveQueuing(true);

    var removeItem = breeze.core.arrayRemoveItem;

    var items = [];

    var muscleGroupService =
    {
        getAll: getAll,
        getSucceeded: getSucceeded,
        getFailed : getFailed,    
        addItem: addItem,
     //   deleteItem: deleteItem,
     //   updateItem : updateItem,
    };

    return muscleGroupService;


    //#region addItem

    function addItem(initialValues) {
        var item =  manager.createEntity("MuscleGroup", initialValues);
        saveChanges().fail(addFailed);
        items.push(item);
        return item;

        function addFailed() {
            removeItem(items, item);
        }
    }

    //#endregion

    //#region SaveChanges
    function saveChanges() {
        return manager.saveChanges()
           .then(saveSucceeded)
           .fail(saveFailed);
    }

    function saveSucceeded(saveResult) {
        logger.success("Saved :D");
        logger.log(saveResult);
    }

    function saveFailed(error) {
        logger.error(error);
        logger.log(error);
    }
    //#endregion
}

这是我的控制器的一部分:

$scope.addNewItem = function() {
        var newItem = muscleGroupService.addItem({ Id: 42, Name: $scope.Name, Description: "ho", ImageUrl: "hey"});
        $scope.items.push(newItem);
    };

这是我得到的错误:

Error: Unable to locate a 'Type' by the name: 'MuscleGroup'. Be sure to execute a query or call fetchMetadata first.
    at proto._getEntityType (http://localhost:7122/Scripts/breeze.debug.js:6056:19)
    at proto.getEntityType (http://localhost:7122/Scripts/breeze.debug.js:6047:21)
    at Object.addItem (http://localhost:7122/Scripts/app/AdminMuscleGroup/MuscleGroupService.js:61:45)
    at Object.$scope.addNewItem (http://localhost:7122/Scripts/app/AdminMuscleGroup/MuscleGroupController.js:16:42)
    at http://localhost:7122/Scripts/angular/angular.js:6365:19
    at http://localhost:7122/Scripts/angular/angular.js:12987:13
    at Object.Scope.$eval (http://localhost:7122/Scripts/angular/angular.js:8057:28)
    at Object.Scope.$apply (http://localhost:7122/Scripts/angular/angular.js:8137:23)
    at HTMLButtonElement.<anonymous> (http://localhost:7122/Scripts/angular/angular.js:12986:17)
    at HTMLButtonElement.jQuery.event.dispatch (http://localhost:7122/Scripts/jquery-1.8.2.js:3063:9) angular.js:5754

在我尝试添加antoher之前,我查询了所有Muslce组。

1 个答案:

答案 0 :(得分:3)

PW Kad正在给你提供线索。

当你写hasServerMetadata: false时,你告诉Breeze不要从服务器获取元数据;你告诉Breeze你会在客户端上提供元数据。您没有在客户端上提供元数据。

您的控制器没有Metadata端点...并且无法提供这样的端点,并且也可以构造为您似乎决心设计的每种类型的控制器。< / p>

在追求每种类型的控制器时,您偏离了标准的Breeze生产力路径。那很好......在你有一点经验之后,知道你在做什么,并知道你为什么要这样做。出于某种原因,hasServerMetadata标志默认为true;你不能把它设置为假,并希望一切都能正常工作。

我建议您备份,遵循Breeze指导,了解它,然后逐步退出该指导,因为您发现了这样做的可靠,商业原因。