我首先使用Entity Framework代码。尝试将负十进制值保存到SQL Server数据库时发生错误。我想保存的模型如下所示。
public class Material
{
public Material()
{
Categories = new List<Category>();
}
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[Required]
public string Name { get; set; }
public string Description { get; set; }
[Required]
public DateTime Taken { get; set; }
public decimal? Latitude { get; set; }
public decimal? Longitude { get; set; }
public virtual ICollection<Category> Categories { get; set; }
}
这里我试图在模型材质中设置小数(纬度/经度)的精度。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Material>().Property(x => x.Latitude).HasPrecision(8, 7);
modelBuilder.Entity<Material>().Property(x => x.Longitude).HasPrecision(8, 7);
}
在数据库中,列信息如下所示:
dbo.Materials.Latitude (decimal(8, 6), null)
dbo.Materials.Longitude (decimal(8, 6), null)
如果我尝试保存像-1m
这样的负值,一切正常。但是,一旦我尝试使用小数(如-123
或-123.123456
保存任何更大的值或值,数据上下文在保存时始终会抛出异常。
我得到的例外是:
保存不公开外键的实体时发生错误 他们关系的属性。 EntityEntries属性将 返回null,因为无法将单个实体标识为源 例外。可以在保存时处理异常 通过在实体类型中公开外键属性更容易。看到 InnerException以获取详细信息。
查看内部异常,我们可以看到这可能是导致问题的原因:
{“参数值'-117.246108'超出范围。”}
我该如何解决这个问题?
答案 0 :(得分:2)
据我所知,扩展名为“HasPrecision(8,7)”,你定义的小数总共有8位数;右侧最多7位数。 十进制-117.246108有9位数,请尝试更改“HasPrecision(9,7)”。
答案 1 :(得分:1)
它的行为与您配置模型完全相同。 HasPrecision(8,7)
表示小数点两边的允许位数总数为8,小数点右侧的总位数为7.因此,小数点左侧只能有一位数字。要存储'-117.246108',您至少需要精度9和比例6.