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 ответ:
Это вызвано ошибкой ядра 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); // ... }