【发布时间】: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 并且从未使用过约束,似乎可以很好地将 SQLint映射到 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