使用int Id表示EF6中的bigint列

时间:2015-08-28 08:45:28

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

我们正在使用Entity Framework 6在具有bigint类型的Id列的旧Sql Server数据库之上构建数据层。我们希望int用于我们的Id列类型,而不是long,我们确信这些表永远不会超出int的大小限制。

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

  

来自物化系统.Int64'的指定演员表。输入到   ' System.Int32'类型无效。

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

3 个答案:

答案 0 :(得分:10)

您应该能够为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; }
}

参考文献:

Configuring the data type of a column

Custom conventions

答案 1 :(得分:3)

这样的事情:

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

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

此策略可用于各种映射,例如Yes / No to true / false,请参阅this question

答案 2 :(得分:2)

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