【问题标题】:EF AsNoTracking Causes error. Expression of type 'System.DateTime' cannot be used for assignment to type 'System.Nullable`1[System.DateTime]'EF AsNoTracking 导致错误。 “System.DateTime”类型的表达式不能用于分配给“System.Nullable`1[System.DateTime]”类型
【发布时间】:2018-06-10 01:38:26
【问题描述】:

今天我决定将我的一个旧 Web 项目从 Asp.net core 1.1 升级到 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,我删除了与日期有关的任何内容,最初只是删除了可为空的日期,然后我意识到对管理员列表的类似调用(a完整的跟踪列表)唯一的区别是 AsNoTracking,那是(测试后)我决定在这里询问的时候。

我的想法是,如果我无意修改、删除等,我应该避免跟踪以提高性能!?

希望有人能对这个问题有所了解!提前致谢!

【问题讨论】:

    标签: c# entity-framework entity-framework-core ef-core-2.1


    【解决方案1】:

    这是由 v2.1 中引入的 EF Core 错误引起的。

    #12215: Exception when loading entity containing a primitive property with matching System.Nullable backing field报告和跟踪。

    未提供解决方法,计划在 v2.2 中修复。

    我可以建议使用属性而不是支持字段来强制 EF:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // ...
    
        modelBuilder.Entity<LocalEvent>()
            .Property(e => e.DateCreated)
            .UsePropertyAccessMode(PropertyAccessMode.Property);
    
        // ...
    }
    

    【讨论】:

    • 我以为我要疯了!谢谢?
    • 你们俩的问题-我在相同的用例中遇到了相同的错误(可空的 DateTime 用于数据库记录创建日期)。 Ivan 链接的错误报告对实践提出了质疑:“令人惊讶的是,这在 2.0 中有效。拥有一个返回与设置不同的值的属性通常会导致问题。例如,使用这种模式,你如何确保 - 1 没有保存到数据库中?”我们使用这个可为空的 DateTime 的方式有问题吗?像 Ivan 的回答那样强制 EF 使用该属性有什么缺点吗?
    • PS 看起来他们将里程碑更改为 v3.0.0,因此可能需要一段时间才能修复此问题。
    • @Jim 最终使用 EF Core 更改跟踪。由于在这种特殊情况下的属性 getter 在每次调用时返回不同的值(当字段为 null 时)。如果“默认”值是常量/固定的,那么我认为没有问题。
    • @IvanStoev 抱歉,您能详细说明一下吗?因此,当字段为空时,属性 getter 将返回一个唯一值 (DateTime.now),但这应该只发生在它是新记录并且我们用创建日期标记它的情况下吗?在这种情况下,没有真正的默认值,记录以空值开始,但如果不应用当前日期/时间,则无法保存。有一个更好的方法吗?通过 EF Core 更改跟踪,您是否意味着他们将在 EF 中构建此功能,因此我们不需要手动编写代码?谢谢你的回复!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多