在EF6中,对bigint列使用int Id

本文关键字:int Id bigint EF6 | 更新日期: 2023-09-27 18:10:16

我们正在使用实体框架6在传统的Sql Server数据库之上构建一个数据层,该数据库具有Id列类型为bigint。我们希望使用int而不是long作为我们的Id列类型,并且我们确信这些表永远不会超过int的大小限制。

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

来自物化'系统'的指定强制类型。Int64'类型的系统。Int32'类型无效。

如何在不修改db列类型的情况下实现我们想要的?

在EF6中,对bigint列使用int Id

您应该能够在您的OnModelCreating方法中为每个受影响的模型指定列的DataType:

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; }
}

引用:

配置列的数据类型

自定义约定

这样怎么样:

class DbEntity
{
    [Key]
    private Int64 Id { get; set; }
    [NotMapped]
    public int SmallerId { 
        get { return Convert.ToInt32(Id); }
    }
}

此策略可用于所有类型的映射,如Yes/No到true/false,参见这个问题

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