zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    Mysql 如何设置字段自动获取当前时间
    如何利用OCS缓存TomcatSession全局变量(转)
    CDN技术分享
    怎么在阿里云服务器部署多个tomcat
    nginx模块开发篇 (阿里著作)
    Nginx开发从入门到精通 学习目录分享学习 (阿里著作)
    阿里云 通过YUM源安装nginx
    Java 模板引擎 jetbrick-template
    七天学会NodeJS
    Android开发之蓝牙 --修改本机蓝牙设备的可见性,并扫描周围可用的蓝牙设备
  • 原文地址:https://www.cnblogs.com/Gun/p/5014840.html
Copyright © 2011-2022 走看看