在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列类型的情况下实现我们想要的?
您应该能够在您的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而不是尝试映射到无法处理数据库中最大值的数据类型?