EF AsNoTracking вызывает ошибку. Выражение типа ' система.DateTime "не может использоваться для присвоения типу" System.Nullable`1[Система.значение datetime]'


Сегодня я решил обновить свой старый веб-проект из Asp.net ядро 1.1-2.1, и все шло довольно гладко, пока я не попытался получить список LocalEvent из БД. Я употреблял .AsNotracking, поскольку мне не нужно было вносить какие-либо изменения в объекты, кроме сортировки / фильтрации.

Это ошибка:

Выражение типа ' система.DateTime ' не может использоваться для присвоения тип ' система.Nullable`1[Система.DateTime] '

Это код I у меня возникли проблемы с:

    var today = DateTime.Now;

    var events = await _context.LocalEvent.Where
    (x => x.ReoccurUntil > today || x.EventEnd > today).AsNoTracking().ToListAsync();

Это модель LocalEvent:

public class LocalEvent
{
    [NotMapped]
    private DateTime? dateCreated;

    [Key]
    public Guid Id { get; set; }

    [MaxLength(200)]
    [Display(Name = "Event Location")]
    [DataType(DataType.MultilineText)]
    public string Location { get; set; }

    [Display(Name = "Added By")]
    public string Author { get; set; }

    [Display(Name = "Contact")]
    public string EventContact { get; set; }

    [Display(Name = "Event Name")]
    public string EventName { get; set; }

    [DataType(DataType.MultilineText)]
    [Display(Name = "Details")]
    public string EventInfo { get; set; }

    [DataType(DataType.Currency)]
    [DisplayFormat(DataFormatString = "{0:C0}", ApplyFormatInEditMode = true)]
    [Display(Name = "Cost")]
    public Decimal? EventCost { get; set; }

    //DateStuff
    [Display(Name = "Date Created")]
    public DateTime DateCreated
    {
        get { return dateCreated ?? DateTime.Now; }
        set { dateCreated = value; }
    }

    [Display(Name = "Event Start")]
    public DateTime EventStart { get; set; }


    [DateGreaterThan("EventStart")]
    [Display(Name = "Event End")]
    public DateTime EventEnd { get; set; }

    public DateTime ReoccurUntil { get; set; }

    [Display(Name = "Reoccurrence Type")]
    public TypeOfOccurrence OccurrenceType { get; set; }

    [Display(Name = "Which Occurence of Weekday")]
    public Nth NthReOccurence { get; set; }

    [Display(Name = "Weekday for Reoccurence")]
    public DayOfWeek ReoccurrenceDay { get; set; }

    [Display(Name = "Occurrence Rate")]
    public OccurrenceRate Occurrence { get; set; }
    public bool DoesReoccur { get; set; }

    [DataType(DataType.ImageUrl)]
    public string Image { get; set; }

    public string ImageDeletePath { get; set; }
    public string Slug { get; set; }
}

На данный момент я просто удалил AsNoTracking, чтобы все снова заработало. Я делаю что-то не так?

Ошибка действительно странная, потому что в ней упоминаются даты, и поэтому потребовалось некоторое время, чтобы проследить до AsNoTracking, я удалил все, что связано с датами, сначала просто удалил nullable даты, затем я понял, что аналогичный вызов для списка администраторов (полный отслеживаемый список) работал с той лишь разницей, что AsNoTracking, и вот тогда (после тестирования) я решил спросить Здесь.

Я считал, что если у меня нет намерения изменять, удалять и т. д., Я должен избегать отслеживания, чтобы улучшить производительность!?

Надеюсь, кто-то сможет пролить немного света на этот вопрос! Заранее спасибо!

1 3

1 ответ:

Это вызвано ошибкой ядра EF, введенной в v2. 1.

Сообщается и отслеживается по #12215: исключение при загрузке сущности, содержащей примитивное свойство с системой сопоставления.Nullable backing field .

Обходной путь не предусмотрен, исправление запланировано на v2. 2.

Что я могу предложить, так это заставить EF использовать свойство, а не резервное поле:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // ...

    modelBuilder.Entity<LocalEvent>()
        .Property(e => e.DateCreated)
        .UsePropertyAccessMode(PropertyAccessMode.Property);

    // ...
}