我们正在使用Entity Framework 6在具有bigint
类型的Id列的旧Sql Server数据库之上构建数据层。我们希望int
用于我们的Id列类型,而不是long
,我们确信这些表永远不会超出int
的大小限制。
但是,我们收到以下错误:
来自物化系统.Int64'的指定演员表。输入到 ' System.Int32'类型无效。
如何在不修改db列类型的情况下实现我们想要的目标?
答案 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; }
}
参考文献:
答案 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 ,而不是尝试映射到无法处理数据库中最大值的数据类型?