我们使用 Entity Framework 6 在旧版 Sql Server 数据库之上构建数据层,该数据库具有
bigint
类型的 Id 列。 我们希望对 Id 列类型使用 int
,而不是 long
,并且我们相信表的增长永远不会超过 int
的大小限制。
但是,我们收到以下错误:
从具体化的“System.Int64”类型到 “System.Int32”类型无效。
如何在不修改db列类型的情况下达到我们想要的效果?
您应该能够在
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; }
}
参考资料:
这样的事情怎么样:
class DbEntity
{
[Key]
private Int64 Id { get; set; }
[NotMapped]
public int SmallerId {
get { return Convert.ToInt32(Id); }
}
}
此策略可用于各种映射,例如是/否到真/假,请参阅这个问题
为什么不在您的实体上使用 Int64,而不是尝试映射到无法处理数据库中最大值的数据类型?
我在代码中选择了
long
而不是Int64
,因为它是C#中的整数数字类型,就像int
一样。我更喜欢一致性。您可能不会在代码中使用 int32
来代替 int
。 long
映射到 Int64
,因此从数据的角度来看它们是相同的。
class Thing
{
private long Id { get; set; }
}