EF AsNoTracking 导致错误。类型 'System.DateTime' 的表达式不能用于对类型 'System.Nullable`1[System.DateTime]' 的赋值
EF AsNoTracking Causes error. Expression of type 'System.DateTime' cannot be used for assignment to type 'System.Nullable`1[System.DateTime]'
今天,我决定将我的一个旧 Web 项目从 Asp.net 核心 1.1 升级到 2.1,在我尝试从数据库中检索 LocalEvent 列表之前,一切都进行得很顺利。我使用的是 .AsNotracking,因为我不需要对排序/过滤之外的对象进行任何更改。
这是错误:
Expression of type 'System.DateTime' cannot be used for assignment to
type '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,我删除了与日期有关的所有内容,最初只是删除了可为空的日期,然后我意识到对管理列表的类似调用(完整的跟踪列表)唯一的区别是 AsNoTracking,那是(测试后)我决定在这里提问的时候。
我的想法是,如果我无意修改、删除等,我应该避免跟踪以提高性能!?
希望有人能对这个问题有所了解!提前致谢!
这是由 v2.1 中引入的 EF Core 错误引起的。
未提供解决方法,计划在 v2.2 中修复。
我可以建议的是强制 EF 使用 属性 而不是支持字段:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// ...
modelBuilder.Entity<LocalEvent>()
.Property(e => e.DateCreated)
.UsePropertyAccessMode(PropertyAccessMode.Property);
// ...
}
今天,我决定将我的一个旧 Web 项目从 Asp.net 核心 1.1 升级到 2.1,在我尝试从数据库中检索 LocalEvent 列表之前,一切都进行得很顺利。我使用的是 .AsNotracking,因为我不需要对排序/过滤之外的对象进行任何更改。
这是错误:
Expression of type 'System.DateTime' cannot be used for assignment to type '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,我删除了与日期有关的所有内容,最初只是删除了可为空的日期,然后我意识到对管理列表的类似调用(完整的跟踪列表)唯一的区别是 AsNoTracking,那是(测试后)我决定在这里提问的时候。
我的想法是,如果我无意修改、删除等,我应该避免跟踪以提高性能!?
希望有人能对这个问题有所了解!提前致谢!
这是由 v2.1 中引入的 EF Core 错误引起的。
未提供解决方法,计划在 v2.2 中修复。
我可以建议的是强制 EF 使用 属性 而不是支持字段:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// ...
modelBuilder.Entity<LocalEvent>()
.Property(e => e.DateCreated)
.UsePropertyAccessMode(PropertyAccessMode.Property);
// ...
}