在 EF6 中使用 int Id 作为 bigint 列

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

我们使用 Entity Framework 6 在旧版 Sql Server 数据库之上构建数据层,该数据库具有

bigint
类型的 Id 列。 我们希望对 Id 列类型使用
int
,而不是
long
,并且我们相信表的增长永远不会超过
int
的大小限制。

但是,我们收到以下错误:

从具体化的“System.Int64”类型到 “System.Int32”类型无效。

如何在不修改db列类型的情况下达到我们想要的效果?

c# entity-framework entity-framework-6
4个回答
14
投票

您应该能够在

OnModelCreating
方法中为每个受影响的模型指定列的数据类型):

modelBuilder.Entity<Department>()   
    .Property(p => p.Id)   
    .HasColumnType("bigint");

如果每个模型中的每个 Id 都映射到

bigint
,那么您可以使用自定义约定:

modelBuilder.Properties<int>()
   .Where(p => p.Name == "Id")
   .Configure(c => c.HasColumnType("bigint"));

另一种技术是对所有具有

bigint
Id
的模型使用抽象基类(此示例显示它使用数据注释而不是流畅的 API:

public abstract class BaseModel
{
   [Column(TypeName="bigint")]
   public int Id { get; set; }
}

参考资料:

配置列的数据类型

自定义约定


3
投票

这样的事情怎么样:

class DbEntity
{
    [Key]
    private Int64 Id { get; set; }

    [NotMapped]
    public int SmallerId { 
        get { return Convert.ToInt32(Id); }
    }
}

此策略可用于各种映射,例如是/否到真/假,请参阅这个问题


2
投票

为什么不在您的实体上使用 Int64,而不是尝试映射到无法处理数据库中最大值的数据类型?


0
投票

我在代码中选择了

long
而不是
Int64
,因为它是C#中的整数数字类型,就像
int
一样。我更喜欢一致性。您可能不会在代码中使用
int32
来代替
int
long
映射到
Int64
,因此从数据的角度来看它们是相同的。

class Thing
{
    private long Id { get; set; }
}
© www.soinside.com 2019 - 2024. All rights reserved.