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);