Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF AsNoTracking导致错误。类型为'的表达式;System.DateTime';不能用于分配给类型';System.Nullable`1[System.DateTime]';_C#_Entity Framework_Entity Framework Core_Ef Core 2.1 - Fatal编程技术网

C# EF AsNoTracking导致错误。类型为'的表达式;System.DateTime';不能用于分配给类型';System.Nullable`1[System.DateTime]';

C# EF AsNoTracking导致错误。类型为'的表达式;System.DateTime';不能用于分配给类型';System.Nullable`1[System.DateTime]';,c#,entity-framework,entity-framework-core,ef-core-2.1,C#,Entity Framework,Entity Framework Core,Ef Core 2.1,今天,我决定将我的一个旧web项目从Asp.net core 1.1升级到2.1,一切都进行得非常顺利,直到我尝试从数据库中检索LocalEvent的列表。我使用的是.AsNotracking,因为除了排序/过滤之外,我不需要对对象进行任何更改 这就是错误: “System.DateTime”类型的表达式不能用于分配给 键入'System.Nullable'1[System.DateTime]' 这是我遇到问题的代码: var today = DateTime.Now; var

今天,我决定将我的一个旧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,我删除了与日期有关的任何内容,最初只是删除了可为空的日期,然后我意识到对管理员列表(一个完整的跟踪列表)的类似调用也起到了作用,唯一的区别是AsNoTracking,那就是(测试后)我决定在这里继续问下去

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


希望有人能在这个问题上透露一些信息!提前谢谢

这是由v2.1中引入的EF核心错误引起的

报告和跟踪

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

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

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

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

    // ...
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
// ...
modelBuilder.Entity()
.Property(e=>e.DateCreated)
.UsePropertyAccessMode(PropertyAccessMode.Property);
// ...
}

我还以为我疯了呢!谢谢你们的提问——我在相同的用例中遇到了相同的错误(用于db记录创建日期的可空DateTime)。错误报告Ivan对这种做法提出了质疑:“令人惊讶的是,这在2.0中起作用。如果属性返回的值与设置的值不同,则通常会导致问题。例如,使用这种模式,如何确保不将-1保存到数据库中?”我们使用此可空日期时间的方式是否有问题?在Ivan的回答中,强制EF使用该属性有什么缺点吗?PS看起来他们将里程标更改为v3.0.0,所以这可能需要一段时间才能得到解决。@Jim最终与EF Core更改跟踪一起使用。因为在这种特殊情况下,属性getter在每次调用时返回不同的值(当字段为
null
时)。如果“默认”值是常量/固定值,那么我看没有问题。@IvanStoev对不起,你能详细说明一下吗?所以当字段为null时,属性getter将返回一个唯一的值(DateTime.now),但只有当它是一个新记录并且我们正在用创建日期为它加盖戳记时,才会发生这种情况,对吗?在这种情况下,没有实际的默认值,记录将以空值开始生命,但在不应用当前日期/时间的情况下无法保存。有更好的方法吗?通过EF核心更改跟踪,您的意思是他们将在EF中构建此功能,这样我们就不需要手动编写代码了吗?谢谢你的回复!!