2015-08-27 4 views
0

Ok я схожу с ума здесь, я пытался писать себе метод обновления в моем хранилище, и по какой-то странной причине я получаю исключение, когда я называю это ...Почему EF генерирует исключение?

public virtual T Update(T entity) 
{ 
    T dbEntity = _context.Set<T>().Find(entity.GetId()); 

    if (dbEntity != null) 
    { 
     _context.SaveChanges(); 
    } 

    return dbEntity; 
} 

Исключение происходит на «_context.SaveChanges();», контекст в этом случае является экземпляром DbContext, а не контекстом объекта. Я использую код EF первого и Т следующим образом ...

public partial class AC_Programme 
{ 
    [Key] 
    public int Id { get; set; } 

    public int OrganisationId { get; set; } 

    [Required] 
    [StringLength(255)] 
    public string Name { get; set; } 

    public string Description { get; set; } 

    public DateTime Start { get; set; } 

    public DateTime End { get; set; } 

    public bool Active { get; set; } 

    [DataType(DataType.Time)] 
    public DateTime AutoCalculationTime { get; set; } 

    [DataType(DataType.Time)] 
    public DateTime AutoCutoffTime { get; set; } 

    public virtual ICollection<AC_Fund> AC_Funds { get; set; } 

    public virtual CX_Organisation Organisation { get; set; } 
} 

Я не могу понять, почему, несмотря на нимало буквально ничего, все, что я делал, было получить объект по идентификатору и вызвать сохранить изменения, что он чувствует необходимость идти в беспорядки с отношениями.

Любые идеи?

EDIT: упс я забыл включить исключение ...

Исключение типа «System.InvalidOperationException» произошло в EntityFramework.dll, но не был обработан в пользовательском коде

Дополнительная информация: Операция завершилась неудачно: отношение не может быть изменено, поскольку одно или несколько свойств внешнего ключа не имеют значения NULL. При изменении отношения к связанному свойству внешнего ключа установлено значение null. Если внешний ключ не поддерживает нулевые значения, необходимо определить новое отношение, для свойства внешнего ключа должно быть назначено другое ненулевое значение, или не связанный объект должен быть удален.

Это становится еще более свойственно ...

public virtual T Update(T entity) 
    { 
     _context.SaveChanges(); 
     return null; 
    } 

... результаты в одной и той же ошибки.

+8

Что такое заброшенное исключение? Вы не разместили его –

+0

, объект исключения содержит свойство ValidationErrors. Это хорошее место, чтобы начать выяснять, почему возникает исключение. – Domysee

+0

. Мне плохо жаль насчет отсутствующей информации об исключении ... Ее там сейчас. – War

ответ

0

Проблема заключалась в том, что некоторый код в дополнение к стеку добавлял изменения в EF, которые не должны были вызывать эту проблему.

Диагностика этой проблемы была возможна, поставив точку останова на вызов SaveChanges и рассмотрев «_context.ChangeTracker.Entries()» для изменений, затем просмотрев стек вызовов, чтобы узнать, что происходит.

В зависимости от сложности вашего собственного кода, если вы столкнулись с этим, вам может быть полезно добавить трекер изменений в окно просмотра, а затем пройти через код до тех пор, пока не появится изменение.

Спасибо за совет @JohnnyHK

0

Глядя на исключение, я предполагаю, что вы забыли установить значение свойства, которое является частью ограничения внешнего ключа; возможно OrganizationId?

Другая возможность заключается в том, что вы удалили дочерний объект из AC_Funds и не отметили его как удаленный. Это привело бы к осиротевшего ребенка, что означает установку свойства внешнего ключа на нулевое значение.

Поскольку ваш внешний ключ не разрешает nulls, дочерний объект не может остаться сиротой и должен быть удален.

Я бы предложил открыть Sql Server Profiler и заглянуть в операторы обновления, созданные Entity Framework.

+0

Нет свойств типа значения null ... но это спорная точка, так как я ничего не обновлял ... если вы прочитали код, я получаю сущность из db, а затем вызову SaveChanges в контексте, ничего больше не делается. – War

+0

@ Варди, что-то должно было измениться. Попробуйте взглянуть под капот с помощью Sql Server Profiler. – RePierre

+0

подключен профилировщик к sql, и это все, что было выполнено ... exec sp_executesql N'SELECT [Extent1]. [Id] AS [Id], [Extent1]. [OrganisationId] AS [OrganisationId], [Extent1 ] [Имя] AS [Name], [Extent1]. [Описание] AS [Описание], [Extent1]. [Start] AS [Start], [Extent1]. [End] AS [End], [Extent1]. [Active] AS [Active], [Extent1]. [AutoCalculationTime] AS [AutoCalculationTime], [Extent1]. [AutoCutoffTime] AS [AutoCutoffTime] FROM [ACOFI]. [AC_Programme] AS [Extent1] WHERE [Extent1]. [Id] = @ EntityKeyValue1 ', N' @ EntityKeyValue1 int ', @ EntityKeyValue1 = 1 – War

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