C#实体框架和数据库-从smallint更改为int

问题描述 投票:0回答:1

由于我们必须进行某些更改,因此数据库中的某些列必须从smallint更改为int,因此,我们必须将代码变量从short]更改>到int

由于这是一个相当大的更改,我们想分两步来做-首先更改数据库,然后再更改代码(或相反)。

我们进行了一个小测试-在不更改代码的情况下将特定表中的列从smallint

更改为int-代码变量仍然期望short

[当使用EF从数据库获取结果并将其分配给适当的c#类时,我们会收到以下错误(这是合理的:)]]

“ System.InvalidOperationException:无法将'TestClass'的'CountryID'属性设置为'System.Int32'值。您必须将此属性设置为'System.Int16'类型的非空值”

编辑:如果我们首先尝试将代码变量更改为int

并使用db列作为smallint
,则会引发类似的异常:

“ System.InvalidOperationException:无法将'TestClass'的'CountryID'属性设置为'System.Int16'值。您必须将此属性设置为类型为'System.Int32'的非空值”

某些代码和数据:

  • DB表具有名为CountryID (int, not null)的列。
  • 匹配类为:
  • public class TestClass
    {
        public short CountryID { get; set; }
    }
    

    modelBuilder是:

        ToTable("Country");
        // mapping an int column in the db (CountryID) to a short variable in the code (CountryID)
        Property(t => t.CountryID).HasColumnName("CountryID").IsRequired(); 
    

    尝试使用EF查询表:

    [var listOfCountryIDs = dbContext.TestEntity.Where(t => t.CountryID == countryID),引发异常。

    [我们试图通过添加.HasColumnType("smallint")来强制模型构建器,但这没有帮助。也尝试过this

    当然,如果我们同时更改代码和数据库以使用ints(或short&smallint),则可以使用。

    有两种方法可以应用此更改吗?任何帮助,将不胜感激,谢谢。

    由于必须进行某些更改,因此数据库中的某些列必须从smallint更改为int,结果,我们必须将代码变量从short更改为int。由于它很漂亮...

    c# entity-framework
    1个回答
    0
    投票

    恐怕,您需要同时更改数据库和模型级别的数据类型。原因是为什么您得到问题中提到的异常是,entityframework试图将来自DB的4字节数据放入Model的2字节中,因为没有这种类型的直接转换可用,因此您要面对它。

    正如您提到的,这是非常大的更改,我建议您一次使用一个数据库/一个模型。

    © www.soinside.com 2019 - 2024. All rights reserved.