Я начал видеть следующую ошибку после внесения некоторых изменений кода в код моего JavaScript-клиента. Я видел, как другие сообщают об этом, но не видели никого, способного сузить условия.Breeze .NET Server code throws Исключение Int32Converter
Int32Converter cannot convert from System.Int64.
После значительного перекопа в проблему это, похоже, является ошибкой в коде сервера Breeze .NET. Часть трассировки стека исключений здесь показывает, где ошибка происходит из:
at Breeze.ContextProvider.EF6.EFContextProvider`1.ConvertValue(Object val, Type toType) in EFContextProvider.cs:line 603
at Breeze.ContextProvider.EF6.EFContextProvider`1.SetPropertyValue(Object entity, String propertyName, Object value) in EFContextProvider.cs:line 573
at Breeze.ContextProvider.EF6.EFContextProvider`1.<>c__DisplayClass10.<RestoreOriginal>b__f(KeyValuePair`2 kvp) in EFContextProvider.cs:line 468
at System.Collections.Generic.List`1.ForEach(Action`1 action)
at Breeze.ContextProvider.EF6.EFContextProvider`1.RestoreOriginal(EntityInfo entityInfo) in EFContextProvider.cs:line 466
at Breeze.ContextProvider.EF6.EFContextProvider`1.<ProcessAllDeleted>b__9(EFEntityInfo entityInfo) in EFContextProvider.cs:line 337
at System.Collections.Generic.List`1.ForEach(Action`1 action)
at Breeze.ContextProvider.EF6.EFContextProvider`1.ProcessAllDeleted(List`1 deletedEntities) in EFContextProvider.cs:line 334
at Breeze.ContextProvider.EF6.EFContextProvider`1.SaveChangesCore(SaveWorkState saveWorkState) in EFContextProvider.cs:line 219
at Breeze.ContextProvider.ContextProvider.OpenAndSave(SaveWorkState saveWorkState)
at Breeze.ContextProvider.ContextProvider.SaveChanges(JObject saveBundle, TransactionSettings transactionSettings)
Что происходит, что EFContextProvider<>.ConvertValue()
вызывается с long
в качестве первого параметра и второго параметра в Type
для int?
. Оттуда извлеченный TypeConverter
не может преобразовать его и выбрасывает вышеуказанное исключение.
Я был в состоянии воспроизвести ошибку, загрузив DocCode и писать следующий тест:
[TestMethod]
public async Task RemovingNavigationProperty()
{
var entityManager = await TestFns.NewEm(_northwindServiceName);
var employee = new Employee()
{
FirstName = "First",
LastName = "Employee"
};
entityManager.AddEntity(employee);
var manager = new Employee()
{
FirstName = "First",
LastName = "Manager"
};
entityManager.AddEntity(manager);
employee.Manager = manager;
try
{
var saveResult = await entityManager.SaveChanges();
// Now reverse everything
manager.EntityAspect.Delete();
employee.Manager = null;
employee.EntityAspect.Delete();
saveResult = await entityManager.SaveChanges();
}
catch (Exception e)
{
var message = string.Format("Save should have succeeded; Received {0}: {1}",
e.GetType().Name, e.Message);
Assert.Fail(message);
}
}