EF AsNoTracking Вызывает ошибку.Выражение типа 'System.DateTime' нельзя использовать для присвоения типу 'System.Nullable`1 [System.DateTime]' - PullRequest
0 голосов
/ 09 июня 2018

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

Это ошибка:

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

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

    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, я удалил все, что связано с датами, сначала просто удалил даты, которые можно обнулять, затем я реализовал аналогичный вызов для администратораlist (полный отслеживаемый список) работал только с тем отличием, что AsNoTracking, и именно тогда (после тестирования) я решил спросить здесь.

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

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

1 Ответ

0 голосов
/ 09 июня 2018

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

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

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

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

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

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

    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...