まず第一に、私は Breeze/Angular に慣れていません...いくつかのブログを読んだり、いくつかのpluralsightビデオを見たりした後、私は(おそらく他のみんなと同じように)とても興奮していましたが、数週間試した後、嫌いになりました。ある問題から別の問題へと走っています。このテクノロジーを習得して使用するにはまだ時期尚早ですか?
ここに私のデータ構造があります:
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
エラーは循環構造について不平を言っていますが、循環構造はまったくありません。実際、この構造は非常に標準的なもので、数週間前に別の試行プロジェクトでほぼ同じ構造を使用していました。私が現在使用している新しいライブラリがいくつかの新しい欠陥を導入したかどうかはわかりません。
この質問が寄せられたことは知っていますが、すべての回答を確認しましたが、解決策が見つかりませんでした。最も関連性の高いものは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)
私の場合は決して真実ではないことに気付きます。
あなたの助けに感謝します。
更新: これは私の 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");