我使用实体框架来读取一个C#控制台应用程序SQLite数据库。
这里的问题是:我有一个包含空字符串的列(如:“”)和映射到C#日期时间属性。
当我尝试在这里读到这些记录是我得到的错误:
最里面的异常System.FormatException:字符串“”无法识别为有效的DateTime。在System.DateTimeParse.Parse(ReadOnlySpan`1 S,的DateTimeFormatInfo dtfi,DateTimeStyles样式)在Microsoft.Data.Sqlite.SqliteValueReader.GetDateTime(的Int32有序)
映射列到一个可空的DateTime不解决问题。
显而易见的解决办法是清理所有的空字符串和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
}
你可能有处理这对你的上下文类的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。