将long数据属性映射到数据库中的int

时间:2013-12-27 15:58:38

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

在我看过的所有示例中都使用int32作为ID。这在生产环境中并不总是实用的。我们的一些数据库具有int64领域的身份ID,因此我们的做法是始终使用long作为我们的ID属性。但是,SQL Server具有更高的int列类型的最大值。

我正在使用Entity Framework第6版进行第一次概念验证。使用long ID,它无法将对象映射到数据库。

我正在使用Fluent API进行所有映射。现在,它看起来像ID:

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

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

  

指定的架构无效。错误:(7,12):错误2019:成员   指定的映射无效。类型   'Edm.Int64 [Nullable = False,DefaultValue =]'的成员'ID'类型   'EFConnection.Space'不兼容   'SqlServer.int [可空=假,默认值=,StoreGeneratedPattern =身份]'   “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"),第一个Assert通过,但我在第二个上得到InvalidOperationException

  

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

1 个答案:

答案 0 :(得分:11)

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

参考文献: