首页 > 代码库 > EF Power Tools 数据库逆向生成时T4模板修改

EF Power Tools 数据库逆向生成时T4模板修改

VS2013上使用EF Power Tools的Reverse Engineer Code First逆向生成。

发现数据库中的decimal(18, 4)字段在生成的mapping类中没有精度和小数位数。

这使得通过EF保存数据时,自动生成的SQL缺省使用了decimal(18, 2).

还好EF Power Tools提供了Customize Reverse Engineer Templates ,并给出了它使用的tt文件。

打开它的Mapping.tt

看到

if (type.ClrEquivalentType == typeof(int)            || type.ClrEquivalentType == typeof(decimal)            || type.ClrEquivalentType == typeof(short)            || type.ClrEquivalentType == typeof(long))        {            if (isKey && storeGeneratedPattern != StoreGeneratedPattern.Identity)            {                configLines.Add(".HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)");            }            else if ((!isKey || efHost.EntityType.KeyMembers.Count > 1) && storeGeneratedPattern == StoreGeneratedPattern.Identity)            {                configLines.Add(".HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)");            }        }    

果然对decimal没处理精度。

加上以下代码:

if(type.ClrEquivalentType == typeof(decimal))            {                //foreach (var f in prop.TypeUsage.Facets)                //{                //    var scale = (Facet)f;                //    WriteLine("//Name:" + scale.Name );                //}                var scale = (Facet)prop.TypeUsage.Facets.SingleOrDefault(f => f.Name == "Scale");                var precision = (Facet)prop.TypeUsage.Facets.SingleOrDefault(f => f.Name == "Precision");                configLines.Add(string.Format(".HasPrecision({0},{1})",precision.Value, scale.Value));            }

 

再次使用Reverse Engineer Code First。

得到带精度的mapping。

            this.Property(t => t.d0)                .HasPrecision(18,0);            this.Property(t => t.d2)                .HasPrecision(18,2);            this.Property(t => t.d4)                .HasPrecision(18,4);

 

EF Power Tools 数据库逆向生成时T4模板修改