繁体   English   中英

使用实体框架在 ASP.NET 核心中为 SQLite 数据库设置 DateTimeKind

[英]Setting DateTimeKind for SQLite database in ASP.NET Core with Entity Framework

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

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

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

对于代码

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

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

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

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

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

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

我觉得Migrate function 创建了自己的连接,因为堆栈跟踪看起来像:

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 class 的 SQLite 连接。

我的解决方案声明这个 class

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 方法。 支持字段

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM