无法使用.net核心和实体框架从sqlite db读取可为空的datetime值

时间:2017-01-06 23:36:00

标签: c# entity-framework sqlite datetime asp.net-core

我有一个游戏模型,其值可以为DateTime

public class Game
{
    [Key]
    public int Id { get; set;}
    public virtual ICollection<PlayerGames> Players { get; set;}
    public DateTime StartTime { get; set; }
    public DateTime? EndTime { get; set; }
    public int? WinnersTeam { get; set; }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public DbSet<Game> Games { get; set; }

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options) {}

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<Game>().ToTable("Game");
        modelBuilder.Entity<Game>()
            .Property<DateTime?>(m => m.EndTime)
            .IsRequired(false)
            .ForSqliteHasColumnType("TEXT");
    }
}

我的程序正在使用在Startup.cs中设置的Sqlite数据库:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlite(Configuration.GetConnectionString("DefaultConnection")));
}

一切正常,但我无法读取EndTime属性的值。但是,当我更新它时,它已成功存储在DB中。

请注意,DateTime值作为TEXT存储在Sqlite中。因此,例如,存储在DB中的值之一是“2017-01-06 20:35:44.880908”,但是当访问属性EndTime时,程序始终返回“01/01/0001 00:07:42”。

如何告诉EF以正确的格式将文本从Sqlite解析为DateTime?

问题答案:

  • 如果数据库中的值为null,则返回的值为null,如果有任何其他值,则返回“01/01/0001 00:07:42”。
  • 我像这样访问了这个值:

    public Game GetFirstGameEndTime()
    {
        var t = _context.Games.First().EndTime;
        return t; // t in debuger is value either null or "01/01/0001 00:07:42"
    }
    

2 个答案:

答案 0 :(得分:1)

我发现的解决方案是将.NET Core更新到1.1.0并将软件包更新到新版本:

  1. Microsoft.NETCore.App,Microsoft.EntityFrameworkCore.Sqlite和其他相关软件包版本从1.0.1到1.1.0
  2. 将“Microsoft.EntityFrameworkCore.Tools”:“1.0.0-preview2-final”更改为“Microsoft.EntityFrameworkCore.Tools.DotNet”:“1.1.0-preview4-final”
  3. 现在可以从DB

    正确加载可以为空的DateTime

答案 1 :(得分:0)

我的MS SQL DB有类似问题,为了避免这种情况,我必须首先检查变量是否不是DBNull.Value。如果它比我简单地为它分配了正常的空值。