EF Power Tools的Reverse Engineer Code First逆向生成Model时处理计算字段

VS2013上使用EF Power Tools的Reverse Engineer Code First逆向生成Model时,没有处理计算字段。在保存实体时会出现错误。

可以通过修改Mapping.tt解决。

打开Mapping.tt,找到

foreach (var prop in efHost.EntityType.Properties)
    {
        var type = (PrimitiveType)prop.TypeUsage.EdmType;
        var isKey = efHost.EntityType.KeyMembers.Contains(prop);
        var storeProp = efHost.PropertyToColumnMappings[prop];
        var sgpFacet = storeProp.TypeUsage.Facets.SingleOrDefault(f => f.Name == "StoreGeneratedPattern");
        var storeGeneratedPattern = sgpFacet == null
            ? StoreGeneratedPattern.None
            : (StoreGeneratedPattern)sgpFacet.Value;
            
        var configLines = new List<string>();
             
        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)");
            }
        }

在 var configLines = new List<string>(); 后添加计算字段的内容:

foreach (var prop in efHost.EntityType.Properties)
    {
        var type = (PrimitiveType)prop.TypeUsage.EdmType;
        var isKey = efHost.EntityType.KeyMembers.Contains(prop);
        var storeProp = efHost.PropertyToColumnMappings[prop];
        var sgpFacet = storeProp.TypeUsage.Facets.SingleOrDefault(f => f.Name == "StoreGeneratedPattern");
        var storeGeneratedPattern = sgpFacet == null
            ? StoreGeneratedPattern.None
            : (StoreGeneratedPattern)sgpFacet.Value;
            
        var configLines = new List<string>();

        if(!isKey && storeGeneratedPattern == StoreGeneratedPattern.Computed)
        {
            configLines.Add(".HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed)");
        }
             
        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)");
            }
        }

 

再次使用Reverse Engineer Code First。

得到带计算字段信息的mapping。

            this.Property(t => t.ResetDate)
                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);

            this.Property(t => t.ResetHour)
                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);

 

posted on 2015-12-03 00:07  Gun 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/Gun/p/5014840.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值