First off, I'm new to breeze/angular...after reading some blogs and watching some pluralsight videos, I (like everybody else I guess) was so excited, but after a few weeks of trying, I started hating it because I'm running from one problem to the other. Is this technology still too early to learn and use?
Here is my data structure:
public class TshirtOrder
{
public int Id { get; set; }
public virtual Student Student { get; set; }
public virtual ICollection<OrderItem> OrderItems { get; set; }
}
public class OrderItem
{
public int Id { get; set; }
[ForeignKey("Type")]
public int TshirtTypeId { get; set; }
public virtual TshirtType Type { get; set; }
[ForeignKey("Size")]
public int TshirtSizeId { get; set; }
public virtual TshirtSize Size { get; set; }
public double UnitPrice { get; set; }
public int Quantity { get; set; }
[ForeignKey("TshirtOrder")]
public int TshirtOrderId { get; set; }
public TshirtOrder TshirtOrder { get; set; }
}
This is related breeze datacontext.js:
function _createTshirtOrder() {
var order = manager.createEntity("TshirtOrder");
order.tshirtItems = [];
order.tshirtItems.push(createOrderItem(lookups.tshirtTypes[0], lookups.tshirtSizes[0], 10));
common.saveEntity(order);
return order;
function createOrderItem(type, size, unitPrice) {
var item = manager.createEntity("OrderItem");
item.type = type;
item.size = size;
item.unitPrice = unitPrice;
item.quantity = 0;
return item;
}
}
When trying to save it at common.saveEntity(order)
, I got the error
Error: Error while interpolating: {{tshirtOrder.orderItems[0]}}
TypeError: Converting circular structure to JSON
The error complains about the circular structure, but I don't have any circular structure at all. In fact, the structure is very standard one and I had the almost same structure working a couple weeks earlier in another trial project. I'm not sure if the new libraries I'm using now has introduced some new defects.
I know this question has been asked, but I checked all answers and couldn't find my solution. The most relevant one is here, and this is the accepted solution:
var cache = [];
JSON.stringify(o, function(key, value) {
if (typeof value === 'object' && value !== null) {
if (cache.indexOf(value) !== -1) {
// Circular reference found, discard key
return;
}
// Store value in our collection
cache.push(value);
}
return value;
});
cache = null; // Enable garbage collection
However, it doesn't work for me. As I debug through it, I realize (cache.indexOf(value) !== -1)
is never true in my case.
Your help is much appreciated.
Update: This is my saveEntity() method:
function _saveEntity(masterEntity) {
// if nothing to save, return a resolved promise
if (!manager.hasChanges()) { return $q(); }
var description = describeSaveOperation(masterEntity);
return manager.saveChanges().then(saveSucceeded).fail(saveFailed);
function describeSaveOperation(entity) {
var statename = entity.entityAspect.entityState.name.toLowerCase();
var typeName = entity.entityType.shortName;
var title = entity.title;
title = title ? (" '" + title + "'") : "";
return statename + " " + typeName + title;
}
function saveSucceeded() {
logger.logInfo("saved " + description);
}
function saveFailed(error) {
var msg = "Error saving " + description + ": " + getErrorMessage(error);
masterEntity.errorMessage = msg;
logger.logError(msg);
// Let user see invalid value briefly before reverting
$timeout(function () { manager.rejectChanges(); }, 1000);
throw error; // so caller can see failure
}
function getErrorMessage(error) {
var reason = error.message;
if (reason.match(/validation error/i)) {
reason = getValidationErrorMessage(error);
}
return reason;
}
function getValidationErrorMessage(error) {
try { // return the first error message
var firstItem = error.entitiesWithErrors[0];
var firstError = firstItem.entityAspect.getValidationErrors()[0];
return firstError.errorMessage;
} catch (e) { // ignore problem extracting error message
return "validation error";
}
}
}
Where manager is
var manager = new breeze.EntityManager("api/Breeze");