如何使用实体框架2.2.2和MySql连接器将类型为“ int unsigned”的列映射为“ long”

时间:2019-04-08 20:53:55

标签: c# mysql entity-framework-core

我在MySql数据库中有一个表,其中的一列为int unsigned类型,代表Unix时间戳。我正在使用带有官方MySql连接器MySql.Data.EntityFrameworkCore(NuGet版本8.0.15)的Entity Framework Core 2.2.2。

在我们的实体模型中,我们尝试使用EndTariffPlan方法中的以下逻辑用类型为long?的属性OnModelCreating表示该字段:

modelBuilder.Entity<User>(entity =>
{
    entity.Property(e => e.EndTariffPlan)
        .HasColumnName("endTariffPlan")
        .HasColumnType("int(11) unsigned");
}

当时间戳大于Int32.MaxValue时,对诸如_dbContext.User.FirstOrDefault()之类的数据库的查询将失败,但

System.OverflowException: Value was either too large or too small for an Int32.

An unhandled exception has occurred while executing the request.    System.OverflowException: Value was either too large or too small for an Int32.
   at System.Convert.ThrowInt32OverflowException()
   at System.UInt32.System.IConvertible.ToInt32(IFormatProvider provider)
   at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
   at MySql.Data.MySqlClient.MySqlDataReader.GetInt32(Int32 i)
   at lambda_method(Closure , DbDataReader )
   at Microsoft.EntityFrameworkCore.Storage.Internal.TypedRelationalValueBufferFactory.Create(DbDataReader dataReader)

我还尝试为此属性添加CastingConverter

var intToLongConverter = new CastingConverter<long, int>();
entity.Property(e => e.EndTariffPlan)
    .HasColumnName("endTariffPlan")
    .HasColumnType("int(11) unsigned")
    .HasConversion(intToLongConverter);

但结果完全相同。

同一代码可用于Entity Framework Core 2.0和MySql.Data.EntityFrameworkCore 8.0.12。

如何使用新版本的Entity Framework Core和MySql.Data.EntityFrameworkCore执行此类映射?也许有解决方法?

0 个答案:

没有答案