【问题标题】:Mapping a long data property to int in database将长数据属性映射到数据库中的 int
【发布时间】:2013-12-27 15:58:38
【问题描述】:

在我看到的所有示例中,都使用int32s 作为 ID。这在生产环境中并不总是可行的。我们的几个数据库的身份 ID 在int64s 范围内,因此我们的做法是始终使用long 作为我们的 ID 属性。但是,对于 int 列类型,SQL Server 具有更高的最大值。

我正在使用实体框架版本 6 进行我们的第一个概念验证。使用 long ID,它无法将对象映射到数据库。

我的所有映射都使用 Fluent API。现在,ID 看起来像这样:

Property(s => s.ID).HasColumnName("spcID");

如果我在上面的末尾添加.HasColumnType("int"),它会给我以下错误:

指定的架构无效。错误:(7,12):错误 2019:会员 指定的映射无效。方式 成员“ID”的“Edm.Int64[Nullable=False,DefaultValue=]”类型 'EFConnection.Space' 不兼容 'SqlServer.int[Nullable=False,DefaultValue=,StoreGeneratedPattern=Identity]' 'CodeFirstDatabaseSchema.Space' 类型中的成员 'spcID'。

如何将这些数据类型映射到 .NET 中的长变量?

编辑

现在,我设置了一个简单的集成测试,以确保我可以连接:

[TestMethod]
public void TestMethod1() {
    using (var context = new Context()) {
        Assert.IsTrue(context.Spaces.Any());
        Assert.IsTrue(context.Spaces.First().IsActive);
    }
}

没有.HasColumnType("int"),第一个断言通过,但我在第二个得到InvalidOperationException

“Space”上的“ID”属性无法设置为“System.Int32”值。您必须将此属性设置为“System.Int64”类型的非空值。

【问题讨论】:

  • 没有.HasColumnType(...) 是否可以工作?我记得使用 EF4 并且从未使用过约束,似乎可以很好地将 SQL int 映射到 C# 的 long 值。
  • 请看我上面的编辑。
  • 我不明白问题出在哪里。如果您在 SQL 中使用 int,请在 C# 中使用 int。如果您在 SQL 中使用 bigint,请在 C# 中使用 long。它们都具有相同的值范围;见特雷弗的回答。
  • 查看 Trevor 的回答,看起来我们在数据库中的 int 约定和 C# 中的 long 约定不正确。充其量,它是数据层的未来证明。
  • 如果您想要面向未来,为什么不同时使用long/bigint?一个是int 一个是long 是愚蠢的。当您超过int 可以保持的值时会发生什么?您的代码可以运行,但是当您尝试将其保存在数据库中时会崩溃 - 这是一个问题。

标签: c# entity-framework entity-framework-6


【解决方案1】:

C# 和 SQL 数据类型兼容:

如果您的表有 bigint 列,请使用 public long Id { get; set; } 如果您的列是 int,请使用 public int Id { get; set; }

SQL

bigint -9,223,372,036,854,775,8089,223,372,036,854,775,807 int -2,147,483,6482,147,483,647

C#

-9,223,372,036,854,775,8089,223,372,036,854,775,807 int -2,147,483,6482,147,483,647

参考资料:

【讨论】:

  • 有趣!我可以发誓他们有不同的最小值/最大值。谢谢你。
  • @SiLo 他们为什么要这么做?它是 32 位或 64 位值。
  • 好的。这让我对我公司标准的有效性感到好奇。也许数据层正在面向未来,如果他们达到数据库中的限制,他们会改变列。我和@SiLo 在一起,并认为他们有不同的最小值/最大值。
  • @krillgar - 数据库中的int 和课堂中的long 不是未来的代码验证——它是一个定时炸弹!
  • 同意。我相信当时的想法是在数据库中运行列更新很容易,而必须推出新的 DLL 需要做很多工作。不过,这绝对不是一个好习惯。
猜你喜欢
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多