Nesse
Nesse

Reputation: 413

BreezeJs: Update to new metadata from changed BreezeController

I've changed and added some properties to my server-side classes but can't get the updated data in my breeze/angular app. The added fields stay blank instead of showing the value. I also can't create an entity that i've added. (error). How can i update the metadata in my breeze/angular app to use the latest version? I've tried to fetch the metadata, but getting the message that it already was fetched.

Breeze: Unable to locate a 'Type' by the name: 'New Class'. Be sure to execute a query or call fetchMetadata first

Update (More Info)


I've created a child class related to my Product class. It's called ProductStockItem, so a Product has many ProductStockItems.

ProductStockItem: (new Class)

public class ProductStockItem
{


    public int Id { get; set; }
    public int ProductId { get; set; }
    public string Size { get; set; }
    public int Quantity { get; set; }
    public bool UseStockQuantity { get; set; }
    public decimal PriceAdjustment { get; set; }
    public DateTime? DateAvailable { get; set; }
    public int DisplayOrder { get; set; }
    public bool Deleted { get; set; }
    public State State { get; set; }
    public DateTime? DateChanged { get; set; }
    public DateTime? DateCreated { get; set; }      

    public virtual Product Product { get; set; }

}

Product:

public class Product
{    
    private ICollection<ProductCategory> _productCategories;
    private ICollection<ProductManufacturer> _productManufacturers;
    private ICollection<ProductPicture> _productPictures;
    private ICollection<ProductSpecificationAttribute> _productSpecificationAttributes;
    private ICollection<ProductStockItem> _productStockItems; 

    public int Id { get; set; }
    public ProductType ProductType { get; set; }
    public int ParentGroupedProductId { get; set; }
    public int ManufacturerSizeId { get; set; }
    public bool VisibleIndividually { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string MetaTitle { get; set; }
    public string MetaDescription { get; set; }
    public int DisplayOrder { get; set; }
    public bool LimitedToStores { get; set; }
    public string Sku { get; set; }
    public string UniqueCode { get; set; }
    public decimal Price { get; set; }
    public decimal OldPrice { get; set; }
    public decimal? SpecialPrice { get; set; }
    public DateTime? SpecialPriceStartDateTimeUtc { get; set; }
    public DateTime? SpecialPriceEndDateTimeUtc { get; set; }
    public decimal DiscountPercentage { get; set; }
    public bool HasTierPrices { get; set; }
    public bool HasStock { get; set; }
    public TaxRate TaxRate { get; set; }
    public bool SyncToShop { get; set; }
    public bool Deleted { get; set; }
    public bool Locked { get; set; }
    public State State { get; set; }
    public DateTime? DateChanged { get; set; }
    public DateTime? DateCreated { get; set; }

    public virtual ICollection<ProductCategory> ProductCategories
    {
        get { return _productCategories ?? (_productCategories = new List<ProductCategory>()); }
        protected set { _productCategories = value; }
    }

    public virtual ICollection<ProductManufacturer> ProductManufacturers
    {
        get { return _productManufacturers ?? (_productManufacturers = new List<ProductManufacturer>()); }
        protected set { _productManufacturers = value; }
    }

    public virtual ICollection<ProductPicture> ProductPictures
    {
        get { return _productPictures ?? (_productPictures = new List<ProductPicture>()); }
        protected set { _productPictures = value; }
    }

    public virtual ICollection<ProductSpecificationAttribute> ProductSpecificationAttributes
    {
        get { return _productSpecificationAttributes ?? (_productSpecificationAttributes = new List<ProductSpecificationAttribute>()); }
        protected set { _productSpecificationAttributes = value; }
    }

    public virtual ICollection<ProductStockItem> ProductStockItems
    {
        get { return _productStockItems ?? (_productStockItems = new List<ProductStockItem>()); }
        protected set { _productStockItems = value; }
    }

 }

Product request:

http://testdomain.local/breeze/DataContext/Products?$filter=Id%20eq%201029&$orderby=Id&$expand=ProductStockItems&

[{"$id":"1","$type":"Erp.Models.ErpModel.Catalog.Product, Erp.Models.ErpModel","Id":1029,"ProductType":"SimpleProduct","ParentGroupedProductId":0,"ManufacturerSizeId":2767,"VisibleIndividually":false,"Name":"Jako Ballenzak Kids - Ash / Action Green","ExtraName":null,"Description":"• Aangenaam functioneel materiaal\nmet moderne oppervlaktestructuur\nvoor de hoogste normen\n• Zeer goede klimaateigenschappen\ndoor actief ademend Twill-Polyester\n• Rekbaar, vormvast en sneldrogend\n\nPolyester-Twill\n100% Polyester,\nbinnenvoering: 100% Polyester","MetaTitle":null,"MetaDescription":null,"DisplayOrder":1,"LimitedToStores":false,"Sku":"9894","UniqueCode":"6_9","Price":34.96,"OldPrice":49.95,"SpecialPrice":null,"SpecialPriceStartDateTime":null,"SpecialPriceEndDateTime":null,"DiscountPercentage":0.00,"HasTierPrices":true,"HasStock":false,"TaxRate":"Tax_21","SyncToShop":true,"Deleted":false,"Locked":false,"State":"Changed","DateChanged":"2014-02-28T10:35:47.733","DateCreated":"2014-02-28T10:35:47.733","ProductCategories":[],"ProductManufacturers":[],"ProductPictures":[],"ProductSpecificationAttributes":[],"ProductStockItems":[]}]

Metadata request:

http://testdomain.local/breeze/DataContext/Metadata

Error Client Side: (create new productStockItem)

Unable to locate a 'Type' by the name: 'ProductStockItem'. Be sure to execute a query or call fetchMetadata first.

    function createProductStockItem(initialValues) {
        return this.manager.createEntity("ProductStockItem", initialValues);
    }

Upvotes: 1

Views: 562

Answers (1)

Adel Sal
Adel Sal

Reputation: 718

When you rebuild your application, the metadata will get updated. No extra job needed for making the metadata to get fetched with it's updated state.

Whenever you issue a query on an entity that is included inside the metadata, the updated metadata will get fetched.

For creating an entity, if you navigate directly to the page of creating an entity prior to any page that includes a query, the metadata won't get fetched in this case.

When you called fetchMetadata(), you still get the error:

Unable to locate a 'Type' by the name: 'New Class'. Be sure to execute a query or call `fetchMetadata` first

That message doesn't indicate that the metadata already was fetched. It still tells you that the entity is unknown and the metadata still not fetched.

Why? Because createEntity() was called before fetchMetadata(). (you can set a break-point and see that in action)

I ran into this before, and what I did, I simply put the fetchMetadata() on application launch.

That will guarantee that it will get fetched first before any call to creating an entity.

Or you can just use a promise:

 manager.fetchMetadata().then(createProductStockItem("Initial values"));

Upvotes: 1

Related Questions