Во-первых, я новичок в бризе/угловой ... после прочтения некоторых блогов и просмотра нескольких видеороликов с множественными точками, я (как и все остальные, которых я думаю) был так взволнован, но после нескольких недель попытки, я начал ненавидеть его, потому что я бегу от одной проблемы к другой. Эта технология еще слишком рано изучать и использовать?Breeze/Angular: TypeError: Преобразование круговой структуры в JSON
Вот моя структура данных:
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; }
}
Это связано ветер 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;
}
}
При попытке сохранить его в common.saveEntity(order)
, я получил ошибку
Error: Error while interpolating: {{tshirtOrder.orderItems[0]}}
TypeError: Converting circular structure to JSON
Ошибка жалуется на круговую структуру, но у меня нет никакой круговой структуры a все. Фактически, структура очень стандартная, и у меня была почти такая же структура, работающая пару недель назад в другом пробном проекте. Я не уверен, что новые библиотеки, которые я сейчас использую, ввели некоторые новые недостатки.
Я знаю, что этот вопрос задан, но я проверил все ответы и не смог найти решение. Наиболее значимые из них является here, и это общепринятое решение:
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
Однако, это не работает для меня. Когда я отлаживаю это, я понимаю, что (cache.indexOf(value) !== -1)
никогда не будет истинным в моем случае.
Ваша помощь очень ценится.
Update: Это мой saveEntity() метод:
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";
}
}
}
Где менеджер
var manager = new breeze.EntityManager("api/Breeze");
Jay, я обновил свой вопрос с помощью этого метода. – newman
Джей, на самом деле, ваш ответ на мой другой вопрос (http://stackoverflow.com/questions/19828467/ef-code-first-the-insert-statement-conflicted-with-the-foreign-key-constraint) решил это проблема. Это сообщение об ошибке вводит меня в заблуждение. Нет круговой ссылки! – newman
Прости, Джей, я говорил слишком рано. Я снова получаю эту ошибку. Теперь я получил полный набор данных, сохраненный без этой ошибки. Тем не менее, когда я пытаюсь вернуть его с помощью расширения бриза, чтобы включить все данные, я снова получил эту ошибку. Я обновлю свой вопрос, чтобы включить эту часть проблемы. – newman