Создание столбца, а затем редактирование столбца дает мне EntityValidationErrors - PullRequest
1 голос
/ 16 марта 2012

Я работаю над проектом MVC3, используя фреймворк First Entity.На веб-странице нажимается кнопка.

Часть того, что происходит, заключается в том, что объект Sale создается для сохранения в базе данных:

 var newSale = new Sale
                                  {
                                      Id = Guid.NewGuid(),
                                      Material = material,
                                      Buyer = buyer,
                                      CashOut = null,
                                      Token = response.Token,
                                      TimeStamp = null
                                  };

                dataContext.Add(newSale);
                dataContext.SaveChanges();

После того, как вы будете перенаправлены в другую функцию контроллера, которая редактирует значение TimeStampсвойство объекта Sale.

        var dataContext = FOSDataContextFactory.Create();
        var = dataContext.Sales.SingleOrDefault(x => x.Token == tokenId);

        if (sale != null)
        {
            sale.TimeStamp = DateTime.UtcNow;    
            dataContext.SaveChanges();
        }

При выполнении пошагового выполнения кода с использованием отладчика все работает нормально, а свойство TimeStamp - изменяется.Но при запуске веб-приложения без отладки кода возникает ошибка:

Проверка не удалась для одного или нескольких объектов.Дополнительные сведения см. В свойстве «EntityValidationErrors».

Это ошибка, которую я получил:

Объект типа: Sale_9C4571E6D8D390FBA94D51E54B356016DF8C20533C767502369BB Состояние: ошибка состояния - 245BBB: свойство B24: 0BBB: измененное состояние: ошибка:: Поле Материал обязательно для заполнения.- Свойство: покупатель, ошибка: поле покупателя обязательно для заполнения.

В чем может быть причина этой проблемы?

Ответы [ 2 ]

3 голосов
/ 16 марта 2012

Свойства Material и Buyer вашей сущности Sale представляются свойствами навигации, относящимися к другим сущностям. И вы, вероятно, пометили эти свойства как virtual, что означает, что они загружаются лениво, как только вы обращаетесь к ним.

Если вы смотрите эти свойства в отладчике, вы запускаете отложенную загрузку, когда получаете к ним доступ через окно просмотра свойств. Этого не происходит, когда вы просто запускаете приложение в режиме Release. Поскольку свойства, кажется, помечены как обязательные, вы получаете исключение в режиме выпуска, поскольку ваш код не обращается к свойствам, и они остаются null, что вызывает исключение проверки.

У вас есть три варианта решения проблемы:

  • Введите свойства внешнего ключа в вашу модель:

    public class Sale
    {
        // ...
        public int MaterialId { get; set; }    // FK property
        public Material Material { get; set; }
    
        public int BuyerId { get; set; }       // FK property
        public Buyer Buyer { get; set; }
        // ...
    }
    

    Когда вы загружаете объект Sale, также загружаются свойства FK, и EF будет рассматривать требуемые ссылки как установленные, и проверка не будет жаловаться.

  • Загрузить свойства навигации с помощью Include:

    var = dataContext.Sales
        .Include(s => s.Material)
        .Include(s => s.Buyer)
        .SingleOrDefault(x => x.Token == tokenId);
    
  • Отключите проверку, только для этой операции:

    var dataContext = FOSDataContextFactory.Create();
    dataContext.Configuration.ValidateOnSaveEnabled = false;
    
    var = dataContext.Sales.SingleOrDefault(x => x.Token == tokenId);
    //...
    
0 голосов
/ 16 марта 2012

Почему бы вам не позволить sql (при условии, что вы используете sql server) создать временную метку для вас? Вам не нужно устанавливать вручную

...