无法保存负十进制值

时间:2012-04-10 10:45:40

标签: c# entity-framework-4.1 ef-code-first sql-server-2008-r2

我首先使用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'超出范围。”}

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

据我所知,扩展名为“HasPrecision(8,7)”,你定义的小数总共有8位数;右侧最多7位数。 十进制-117.246108有9位数,请尝试更改“HasPrecision(9,7)”。

答案 1 :(得分:1)

它的行为与您配置模型完全相同。 HasPrecision(8,7)表示小数点两边的允许位数总数为8,小数点右侧的总位数为7.因此,小数点左侧只能有一位数字。要存储'-117.246108',您至少需要精度9和比例6.