breeze.getEntityGraph завершается ошибкой после сохранения удаленного объекта
********** ОБНОВЛЕНИЕ С ЭКРАНОМ СНИМКА **************** Первое примененное исправление исправило возникновение этой проблемы при удалении listitem и попытке сохранить другой объект.
Но когда у меня есть 2 списка с одним и тем же базовым типом, как в этом примере, AvailableSolidRoutes & AvailableLiquidRoutes с AvailableRoute в качестве базового типа.
GetEntityGraph завершается ошибкой, когда я удаляю последний объект AvailableSolidRoute и AvailableLiquidRoutes пусты. Я знаю, что это struture работает, потому что если я вызываю getEntityType и getChanges, передавая эти типы в... сохранение сохраняется в БД.
Таким образом, эта ошибка возникает только при удалении последнего элемента из любого типа списка, когда другой тип списка пуст.
Вот снимок экрана
Действия по воспроизведению:
1) Удалить AvailableSolidRoute
2) Вызовите datacontext.saveChanges()
3) Добавить в наличии LiquidRoute
4) Вызовите datacontext.saveChanges()
Сбой метода getEntityGraph при попытке сохранить другую сущность после успешного сохранения удаленной сущности, поскольку он все еще обнаруживает удаленную сущность, помеченную как отсоединенную.
У меня сложилось впечатление, что объект, помеченный как отдельный, не виден менеджеру
Это мой код сохранения dataContext (на стороне клиента)
function buildEntityGraphPath(entity) {
var graphPath;
var drugOptionIdx = entity.drugOptions.length;
while (drugOptionIdx--) {
var drugOption = entity.drugOptions[drugOptionIdx];
drugOption.availableRoute
if (drugOption.availableRoutes.length > 0) {
graphPath = 'drugOptions.availableRoutes';
}
if (drugOption.availableDrugForms.length > 0) {
graphPath += ', drugOptions.availableDrugForms';
}
if (drugOption.availableUnits.length > 0) {
graphPath += ', drugOptions.availableUnits';
}
}
return graphPath;
}
function saveDictionaryChanges(entity) {
var entityChanges = [];
var graphPaths = buildEntityGraphPath(entity);
var graph = manager.getEntityGraph(entity, graphPaths);//'drugOptions.availableRoutes, drugOptions.availableDrugForms');
// Filter for changes only
graph = graph.filter(function (entity) {
return entity.entityAspect.entityState !== breeze.EntityState.Unchanged;
});
return manager.saveChanges(graph)
.then(saveSucceeded, saveFailed);
function saveSucceeded(result) {
//TODO: Commented out because WIP is on the back burner
//zStorage.save();
logSuccess('Saved Data', result, true);
}
function saveFailed(error) {
var msg = config.appErrorPrefix + 'Save failed: ' +
breeze.saveErrorMessageService.getErrorMessage(error);
error.message = msg;
logError(msg, error);
throw error;
}
Это объекты на стороне сервера
public class AvailableRoute {
public int Id { get; set; }
public int DrugOptionId { get; set; }
public int RouteId { get; set; }
public virtual Route Route { get; set; }
}
public class AvailableSolidRoute : AvailableRoute {
public AvailableSolidRoute( ) { }
}
public class AvailableLiquidRoute : AvailableRoute {
public AvailableLiquidRoute( ) { }
}
То же самое и здесь, в итоге мы получим 5 или 6 различных типов, но пока только эти 2, пока я не заработаю. Каждый тип имеет свойства, специфичные для данного типа.
public class DrugOption {
public int Id { get; set; }
public int DrugId { get; set; }
public List<AvailableRoute> AvailableRoutes{ get; set; }
public string SpecialInstructions { get; set; }
}
public class SolidOption : DrugOption {
public SolidOption( ) { }
}
public class LiquidOption : DrugOption {
public LiquidOption( ) { }
}
Это родительский объект, который содержит список вариантов полиморфных препаратов.
public class Drug {
public int Id { get; set; }
public string Name { get; set; }
public string TextLine1{ get; set; }
public string TextLine2 { get; set; }
public string TextLine3 { get; set; }
public string TextLine4 { get; set; }
public int? DisplayOrder { get; set; }
public List <DrugOption> DrugOptions { get; set; }
public Drug( ) { }
}
1 ответ
Я думаю, что вы столкнулись с getEntityGraph
ошибка... которую я только что исправил. Если я прав насчет проблемы, о которой вы сообщаете, эта функция наткнулась (глубоко внутри) на пустую ссылку, а не на отдельную сущность.
Смотрите мой обновленный ответ здесь.
Исправленная версия появится в следующем официальном релизе. Вы можете получить текущий getEntityGraph.js от github прямо сейчас.