在将列映射到SQLlite中的DateTime属性时,如何忽略字符串为空的值?

时间:2019-02-02 18:48:20

标签: c# entity-framework sqlite datetime

我使用Entity Framework从C#控制台应用程序读取SQLite数据库。

下面的问题是:我有许多列包含空字符串(例如:“”)和被映射到C#一个DateTime属性。

当我尝试在这里读到这些记录是我得到了错误:

  

最里面的异常System.FormatException:字符串 '' 是   无法识别为有效的DateTime。在   System.DateTimeParse.Parse(ReadOnlySpan`1 S,的DateTimeFormatInfo dtfi,   DateTimeStyles样式)在   Microsoft.Data.Sqlite.SqliteValueReader.GetDateTime(的Int32有序)

映射的列可为空的日期时间不解决问题。

明显的解决方案是清理所有那些空字符串和由NULL值替换它们。这不是在我的情况微不足道,我不能保证不会出现在未来的任何其他字符串空值。

出人意料地,如果映射到整数的列包含一个空字符串值,它的工作原理(值被映射到“0”)。

有一种方法对那些空字符串值时,映射忽略为DateTime? (例如:它会返回一个空日期或DateTime.MinValue)。注:我使用ISO 8601格式不蜱

编辑: 这是我的代码

public class FooContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder builder) {     
           builder.UseSqlite("Data Source=Database.db");
    }

    public DbSet<Bar> Bar { get; set; }
}

public class Bar
{
    public int ID { get; set; }
    public DateTime? SomeDate { get; set; }
}

using(FooContext context = new FooContext())
{                
    var bar = context.Find<Bar>(id); //throw exception
} 

1 个答案:

答案 0 :(得分:0)

您可能必须在上下文类的OnModelCreating方法上进行处理。其实你要重写此方法。在此方法中,我们创建一个转换器,该转换器将用于转换从数据库中读取的属性SomeDate的值:

public class FooContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder builder) {     
           builder.UseSqlite("Data Source=Database.db");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        DateTime parsedDateTime;
        var converter = new ValueConverter<string, DateTime?>(
            v => string.IsNullOrWhiteSpace(v)
                ? null
                : DateTime.TryParse(v, out parsedDateTime)
                    ? parsedDateTime
                    : (DateTime?) null,
            v => v != null
                ? v.ToString()
                : string.Empty);

        modelBuilder
           .Entity<Bar>()
           .Property(b=>b.SomeDate)
           .HasConversion(converter);
    }    

    public DbSet<Bar> Bar { get; set; }
}

您可以阅读有关值转换here的更多信息。