【问题标题】:Setting DateTimeKind for SQLite database in ASP.NET Core with Entity Framework使用 Entity Framework 在 ASP.NET Core 中为 SQLite 数据库设置 DateTimeKind
【发布时间】:2020-06-16 14:07:16
【问题描述】:

我有一个连接到 sqlite 数据库的 ASP.NET Core 应用程序。尽管我将所有 DateTime 值用作 UTC(使用 DateTime.UtcNowvalue.ToUniversalTime()),但我仍然从数据库中获取日期时间值 DateTimeKind.Unspecified

我试图在连接字符串中设置DateTimeKind=Utc,但后来我得到了

System.ArgumentException:不支持关键字:'datetimekind'

代码

var context = services.GetRequiredService<ApplicationDbContext>();
context.Database.Migrate();

我也已经尝试过this 解决方案:

services.AddDbContext<ApplicationDbContext>(options =>
{
    var connectionString = Configuration.GetConnectionString("DatabaseConnection");

    var conn = new SQLiteConnection(connectionString);
    conn.Open();

    var x = options.UseSqlite(
        conn
    );
});

但在迁移时仍然会产生相同的错误。

我感觉Migrate 函数创建了它自己的连接,因为堆栈跟踪看起来像:

at Microsoft.Data.Sqlite.SqliteConnectionStringBuilder.GetIndex(String keyword)  
at Microsoft.Data.Sqlite.SqliteConnectionStringBuilder.set_Item(String keyword, Object value)  
at System.Data.Common.DbConnectionStringBuilder.set_ConnectionString(String value)  
at Microsoft.Data.Sqlite.SqliteConnectionStringBuilder..ctor(String connectionString)  
at Microsoft.EntityFrameworkCore.Sqlite.Storage.Internal.SqliteDatabaseCreator.Exists()  
at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.Exists()  
at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)  
at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.Migrate(DatabaseFacade databaseFacade)  

人们注意到堆栈跟踪通过了

Microsoft.Data.Sqlite.SqliteConnectionStringBuilder

但我不知道为什么会这样。

对迁移的调用如下所示:

var context = services.GetRequiredService<ApplicationDbContext>();
context.Database.Migrate();

据我所知,context 应该包括我基于 SQLiteConnection 类的 SQLite 连接。

【问题讨论】:

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


【解决方案1】:

我的解决方案 声明这个类

public static class DateTimeExtensions
{
    public static DateTime ToUtc(this DateTime value)
    {
        if (value.Kind == DateTimeKind.Unspecified)
        {
            value = DateTime.SpecifyKind(value, DateTimeKind.Utc);
        }
        else if (value.Kind == DateTimeKind.Local)
        {
            value = value.ToUniversalTime();
        }
        return value;
    }
    public static DateTime? ToUtc(this DateTime? value)
    {
        if (value.HasValue)
        {
            return ToUtc(value.Value);
        }
        return value;
    }
}

然后像这样声明 DateTime 属性

   private DateTime __Fecha;
   public DateTime Fecha { get => __Fecha; set => __Fecha = value.ToUtc(); }

警告 阅读本文,不要使用 _Fecha 或 EF 阅读不要使用 set 方法。 Backing Fields

【讨论】:

    猜你喜欢
    • 2018-08-02
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 2018-11-21
    相关资源
    最近更新 更多