我使用EF Power Tool对数据库表进行逆向工程,其精度为(18,4)的十进制字段。
但是,小数点插入的精度四舍五入到小数点后两位。
CodePlex上有一篇文章似乎说错误是修复的。 (https://entityframework.codeplex.com/workitem/734)
但是,我仍然看到了这个问题。我已经下载了最新版本的Power Tools,并确保使用Entity Framework 6.1.0。
如果我改变映射代码(见下文),我可以得到我需要的精度。
this.Property(t => t.G_KWH).HasColumnName("G_KWH").HasPrecision(18,4);
但是,下次我对数据库进行逆向工程时,我的映射代码编辑将被删除。
也许我做错了什么。也许这个bug并没有真正解决。也许你可以帮我提供一个解决方案,如果我再次对数据库进行逆向工程,它将不会被复制。
任何帮助都将不胜感激。
我的表:
CREATE TABLE [dbo].[ConvertCarb](
[ConvertCarbID] [int] IDENTITY(1,1) NOT NULL,
[CountryID] [int] NULL,
[StateProvID] [int] NULL,
[KWH_FT2] [float] NULL,
[G_KWH] [decimal](18, 4) NULL,
[NatGas_GJ_M2] [float] NULL,
[FuelOil_GJ_M2] [float] NULL,
CONSTRAINT [PK_ConvertCarb] PRIMARY KEY CLUSTERED
(
[ConvertCarbID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[ConvertCarb] WITH NOCHECK ADD CONSTRAINT [FK_ConvertCarb_Countries] FOREIGN KEY([CountryID])
REFERENCES [dbo].[Countries] ([CountryID])
GO
ALTER TABLE [dbo].[ConvertCarb] NOCHECK CONSTRAINT [FK_ConvertCarb_Countries]
GO
ALTER TABLE [dbo].[ConvertCarb] WITH NOCHECK ADD CONSTRAINT [FK_ConvertCarb_StateProvinces] FOREIGN KEY([StateProvID])
REFERENCES [dbo].[StateProvinces] ([StateProvID])
GO
ALTER TABLE [dbo].[ConvertCarb] NOCHECK CONSTRAINT [FK_ConvertCarb_StateProvinces]
GO
运行时代码:
CarbonContext db = new CarbonContext();
var convertCarb = new ConvertCarb();
convertCarb.CountryID = 164;
convertCarb.StateProvID = null;
convertCarb.KWH_FT2 = 0;
convertCarb.G_KWH = Decimal.Parse("0.1234");
convertCarb.NatGas_GJ_M2 = 0;
convertCarb.FuelOil_GJ_M2 = 0;
db.ConvertCarbs.Add(convertCarb);
db.SaveChanges();
映射:
public class ConvertCarbMap : EntityTypeConfiguration<ConvertCarb>
{
public ConvertCarbMap()
{
// Primary Key
this.HasKey(t => t.ConvertCarbID);
// Properties
// Table & Column Mappings
this.ToTable("ConvertCarb");
this.Property(t => t.ConvertCarbID).HasColumnName("ConvertCarbID");
this.Property(t => t.CountryID).HasColumnName("CountryID");
this.Property(t => t.StateProvID).HasColumnName("StateProvID");
this.Property(t => t.KWH_FT2).HasColumnName("KWH_FT2");
this.Property(t => t.G_KWH).HasColumnName("G_KWH");
this.Property(t => t.NatGas_GJ_M2).HasColumnName("NatGas_GJ_M2");
this.Property(t => t.FuelOil_GJ_M2).HasColumnName("FuelOil_GJ_M2");
// Relationships
this.HasOptional(t => t.Country)
.WithMany(t => t.ConvertCarbs)
.HasForeignKey(d => d.CountryID);
this.HasOptional(t => t.StateProvince)
.WithMany(t => t.ConvertCarbs)
.HasForeignKey(d => d.StateProvID);
}
}
答案 0 :(得分:1)
我发现此问题的解决方案基于Decimal precision and scale in EF Code First。
实际上,上述解决方案涉及将精度信息添加到数据库上下文的OnModelCreating函数中。这可行,但正如您所提到的,问题在于使用“逆向工程代码优先”将删除精度信息。
为了解决这个问题,我选择创建一个继承自原始上下文类的新上下文类:
public partial class OriginalContext : DbContext
{
...
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
...
// This would be overwritten if we left it in the OriginalContext class
// modelBuilder.Entity<ConvertCarb>().Property(x => x.G_KWH).HasPrecision(18, 4);
}
}
public class ExtendedContext : OriginalContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// Put the code here instead so it isn't overwritten when we reverse engineer
modelBuilder.Entity<ConvertCarb>().Property(x => x.G_KWH).HasPrecision(18, 4);
}
}
当我需要一个上下文对象时,我现在可以使用ExtendedContext了。如果底层数据库发生变化,这将提供适当的精度,而不必担心它会被覆盖。
答案 1 :(得分:0)
当我遇到这个问题EF 6.1.0和PT 0.9.0.0时,我手动更正了映射。
我推荐你。