由于我们必须进行某些更改,因此数据库中的某些列必须从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。由于它很漂亮...
恐怕,您需要同时更改数据库和模型级别的数据类型。原因是为什么您得到问题中提到的异常是,entityframework试图将来自DB的4字节数据放入Model的2字节中,因为没有这种类型的直接转换可用,因此您要面对它。
正如您提到的,这是非常大的更改,我建议您一次使用一个数据库/一个模型。