EF电动工具 - 逆向工程 - 十进制精度

时间:2014-04-18 12:50:11

标签: c# sql-server entity-framework visual-studio

我使用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);

    }
}

2 个答案:

答案 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时,我手动更正了映射。

我推荐你。