2013-11-07 3 views
0

Во-первых, я новичок в бризе/угловой ... после прочтения некоторых блогов и просмотра нескольких видеороликов с множественными точками, я (как и все остальные, которых я думаю) был так взволнован, но после нескольких недель попытки, я начал ненавидеть его, потому что я бегу от одной проблемы к другой. Эта технология еще слишком рано изучать и использовать?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"); 

ответ

0

Что такое код за common.saveEntity (заказ)? Вы проходите через метод EntityManager.saveChanges?

+0

Jay, я обновил свой вопрос с помощью этого метода. – newman

+0

Джей, на самом деле, ваш ответ на мой другой вопрос (http://stackoverflow.com/questions/19828467/ef-code-first-the-insert-statement-conflicted-with-the-foreign-key-constraint) решил это проблема. Это сообщение об ошибке вводит меня в заблуждение. Нет круговой ссылки! – newman

+0

Прости, Джей, я говорил слишком рано. Я снова получаю эту ошибку. Теперь я получил полный набор данных, сохраненный без этой ошибки. Тем не менее, когда я пытаюсь вернуть его с помощью расширения бриза, чтобы включить все данные, я снова получил эту ошибку. Я обновлю свой вопрос, чтобы включить эту часть проблемы. – newman

Смежные вопросы