Web项目从Oracle转为Mysql,fluentnhibernate-1.0和NHibernate2.1.0升级到NHibernate3.3的注意事项

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介:

1、Oracel数据库没有字段自增长属性,要实现自增长通常是通过查询序列或者触发器来实现的。

设置自增长主键

alter table  SUB_SUBSCRIPTION add primary key(ID);
alter table  SUB_SUBSCRIPTION modify column ID int(11) NOT NULL AUTO_INCREMENT;

2、MySQL如何获取行号

MySQL中没有直接获取行号的函数,但是可以自己创建一个函数。

复制代码
-- 创建行号函数
CREATE FUNCTION func_rowNumber() RETURNS int
    NO SQL
    NOT DETERMINISTIC
     begin
      SET @var := @var + 1;
      return @var;
     end;
复制代码

3、Mysql中的视图不支持子查询,可以通过创建中间视图的方式实现。

复制代码
-- 中间视图
create view vm_log_syn_temp(`TABLE_NAME`,`KEY_INFO`,`LOG_ID`,`CODE`,`NAME`,`ERROR_KEYS`,`ERROR_TYPE`,`ERROR_INFO`,`LOG_DATE`) as
                                                             -- 会员同步
           SELECT 'MBR_MEMBERS_TEMP' AS table_name,
                  '会员号:' || mbr.MEMBER_ID AS key_info,
                  m1.ID AS log_id,
                  m1.job_name AS code,
                  m1.job_description AS NAME,
                  m1.foreign_key AS error_keys,
                  m1.error AS ERROR_TYPE,
                  m1.description || ':' || m1.foreign_key AS error_info,
                  m1.error_date AS log_date
             FROM mbr_members_temp mbr
                  LEFT OUTER JOIN log_syn m1
                     ON CAST(mbr.MEMBER_ID AS CHAR)= m1.temp_key
            WHERE mbr.syncs = -1;      --
create view vm_log_syn(ID,`TABLE_NAME`,`KEY_INFO`,`LOG_ID`,`CODE`,`NAME`,`ERROR_KEYS`,`ERROR_TYPE`,`ERROR_INFO`,`LOG_DATE`) as
SELECT func_rowNumber() AS ID,`TABLE_NAME`,`KEY_INFO`,`LOG_ID`,`CODE`,`NAME`,`ERROR_KEYS`,`ERROR_TYPE`,`ERROR_INFO`,`LOG_DATE` from vm_log_syn_temp;
复制代码

4、Orace字段名称可以用“包起来,而在Mysql中用的是`

5、日期格式不一样

Oracel:TO_DATE('2014-02-17 11:44:21', 'YYYY-MM-DD HH24:MI:SS')

MySQL:str_to_date('2013-12-24 16:26:20', '%Y-%m-%d %H:%i:%s')

6、C#读取MySql时,如果存在字段类型为date/datetime时的可能会出现以下问题“Unable to convert MySQL date/time value to System.DateTime”

原因:可能是该字段(date/datetime)的值默认缺省值为:0000-00-00/0000-00-00 00:00:00,这样的数据读出来转换成System.DateTime时就会有问题;
解决办法:
1、将该字段的缺省值设置为null,而不是0000-00-00/0000-00-00 00:00:00的情况;
2、在链接MySQL的字符串中添加:Convert Zero Datetime=True 和 Allow Zero Datetime=True两个属性;
3、将该字段设置成字符串类型;

我是直接在nhibernate中添加Convert Zero Datetime=True  解决问题。

 <property name="connection.connection_string">server = 192.168.2.155; database = eshop; uid = root; pwd = root;charset=utf8;Convert Zero Datetime=True;</property>

7、nhibernate中oracle连接的时候,这里是服务名

oracle配置文件名称:tnsnames.ora

nhibernate中oracle连接的时候,这里是服务名,而不是IP地址

tnsnames.ora所在路径E:\app\Zouqj\product\11.2.0\dbhome_1\NETWORK\ADMIN

8、Web站点在本地运行没问题,发布到IIS上面提示“未能加载文件或程序集”

原因:操作系统是64位的,但发布的程序引用了一些32位的ddl,所以出现了兼容性的问题
解决方案一:如果是64位机器,IIS——应用程序池——高级设置——启用32位应用程序 :true。
解决方案二:修改项目属性——生成——目标平台(比如,X86\X64

9、Oracle中的number类型转到Mysql中变成了decimal类型,有一些本来应该是int类型的。

10、命名空间引用变化

旧:using FluentNHibernate.Mapping;

新:

using NHibernate.Mapping.ByCode;
using NHibernate.Mapping.ByCode.Conformist;

11、数据映射变化

子类映射(注释部分是旧的方式)

  public class IntegralCartItem:CartItem

复制代码
    public class CartItemMap : ClassMapping<CartItem>
    {
        public CartItemMap()
        {
            Table("CART_GOODS_ITEM");
            //Id(p => p.ID, m => m.Column("CART_ITEM_ID").GeneratedBy.Assigned();
            Id(p => p.ID, m => { m.Generator(Generators.Identity); m.Column("CART_ITEM_ID"); });

            Property(p => p.CartId, m => { m.Column("CART_ID"); });
            Property(p => p.ClubID, m => m.Column("CLUB_ID"));
            Property(p => p.ProductName, m => m.Column("PRODUCT_NAME"));
            Property(p => p.ProductType, m => m.Column("PRODUCT_TYPE"));
            Property(p => p.Quantity);
            Property(p => p.OriginalPrice, m => m.Column("ORIGINAL_PRICE"));
            Property(p => p.SilverPrice, m => m.Column("SILVER_PRICE"));
            Property(p => p.PlatinaPrice, m => m.Column("PLATINA_PRICE"));
            Property(p => p.GoldPrice, m => m.Column("GOLD_PRICE"));
            Property(p => p.CreateDate, m => m.Column("CREATE_DATE"));
            Property(p => p.ProductGroup, m => m.Column("PRODUCT_GROUP"));
            Property(p => p.GiftItemId, m => m.Column("GIFT_ITEM_ID"));
            Property(p => p.ProductCode, m => m.Column("PRODUCT_CODE"));
            Property(p => p.MemberId, m => m.Column("MEMBER_ID"));
            Property(p => p.IP);
            Property(p => p.Integral);
            Property(p => p.IntegralToMoney, m => m.Column("INTEGRAL_TO_MONEY"));
            //DiscriminateSubClassesOnColumn("SALE_TYPE", 0); //del by zouqj 
            Discriminator(p => p.Column("SALE_TYPE"));
            DiscriminatorValue(0);
        }
    }

    public class IntegralCartItemMap : SubclassMapping<IntegralCartItem>
    {
        public IntegralCartItemMap()
        {
            DiscriminatorValue(-10);
        }
    }
复制代码

新:

复制代码
     private ISessionFactory CreateSessionFactory(string sessionFactoryConfigPath, ISessionFactory sessionFactory)
        {
            //  如果没有匹配的 SessionFactory 则创建一个新的
            if (sessionFactory == null)
            {
                Check.Require(!File.Exists(sessionFactoryConfigPath),
                    "The config file at '" + sessionFactoryConfigPath + "' could not be found");

                NHibernate.Cfg.Environment.UseReflectionOptimizer = false;
                Configuration cfg = new Configuration();
                cfg.Configure(sessionFactoryConfigPath);

                var data = "EStore.Data";// System.Configuration.ConfigurationManager.AppSettings["Data"];
                if (!string.IsNullOrEmpty(data))
                {
                    ModelMapper mapper = new ModelMapper(new MyInspector());
                    foreach (var assembly in data.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries))
                    {
                        MapModel(assembly, mapper);
                    }
                    var hbmMapping = mapper.CompileMappingForAllExplicitlyAddedEntities();
                    cfg.AddMapping(hbmMapping);
                }

                sessionFactory = cfg.BuildSessionFactory();


                if (sessionFactory == null)
                {
                    throw new InvalidOperationException("cfg.BuildSessionFactory() returned null.");
                }

                sessionFactories[sessionFactoryConfigPath] = sessionFactory;
            }

            return sessionFactory;
        }
        /// <summary>
复制代码
复制代码
    class MyInspector : ExplicitlyDeclaredModel
    {
        public override bool IsEntity(Type type)
        {
            //if (type == typeof(TemporarySetCartItem))
                if(type.Name.Contains("TemporarySetCartItem"))
                return false;
            return base.IsEntity(type);
        }
    }
复制代码

旧:

复制代码
        private ISessionFactory CreateSessionFactory(string sessionFactoryConfigPath, ISessionFactory sessionFactory)
        {
            Check.Require(File.Exists(sessionFactoryConfigPath),
                "The config file at '" + sessionFactoryConfigPath + "' could not be found");

            LogManager.Logger.Info("Create ISessionFactory" + sessionFactoryConfigPath);

            Configuration cfg = new Configuration();
            cfg.Configure(sessionFactoryConfigPath);

            #region MyRegion
            string fluentAssembly = "1";// Analyze(cfg);
            //  创建一个新的 SessionFactory,如果fluentAssembly为空,值使用传统方式创建SessionFactory,否则用Fluently创建
            if (string.IsNullOrEmpty(fluentAssembly))
            {
                sessionFactory = cfg.BuildSessionFactory();
            }
            else
            {
                sessionFactory = Fluently.Configure()
                    .Database(MsSqlConfiguration.MsSql2008.ConnectionString("northwind"))//这是一个无效的值。主要为适应Fluently必需设置此处,通过ExposeConfiguration来覆盖他
                    .Mappings(p => p.FluentMappings.AddFromAssembly(Assembly.Load("EStore.Data")))
                    .ExposeConfiguration(p =>
                    {
                        //覆盖和扩展Fluently的配置信息
                        foreach (string key in cfg.Properties.Keys)
                            p.Properties[key] = cfg.Properties[key];
                    })
                    .BuildSessionFactory();
            } 
            #endregion

            if (sessionFactory == null)
            {
                throw new InvalidOperationException("cfg.BuildSessionFactory() returned null.");
            }
            return sessionFactory;
        }
复制代码

12、No row with the given identifier exists[X]

数据问题,两张表之间进行了映射,X表中没有对应的记录,删除无用记录即可。


本文转自邹琼俊博客园博客,原文链接:http://www.cnblogs.com/jiekzou/p/5511100.html,如需转载请自行联系原作者

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
5月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
567 1
|
6月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
748 64
|
7月前
|
安全 JavaScript Java
java Web 项目完整案例实操指南包含从搭建到部署的详细步骤及热门长尾关键词解析的实操指南
本项目为一个完整的JavaWeb应用案例,采用Spring Boot 3、Vue 3、MySQL、Redis等最新技术栈,涵盖前后端分离架构设计、RESTful API开发、JWT安全认证、Docker容器化部署等内容,适合掌握企业级Web项目全流程开发与部署。
617 0
|
8月前
|
IDE 开发工具 Python
魔搭notebook在web IDE下,使用jupyter notebook,python扩展包无法更新升级
魔搭notebook在web IDE下,使用jupyter notebook,python扩展包无法更新升级,不升级无法使用,安装python扩展包的时候一直停留在installing
226 4
|
9月前
|
人工智能 安全 程序员
用 Colab 和 ngrok 免费部署你的 Web UI 项目,随时随地访问!
用 Colab 和 ngrok 免费部署你的 Web UI 项目,随时随地访问!
1125 12
|
缓存 JSON 监控
如何在项目中保证 Web 组件化的性能
保证 Web 组件化的性能需要从多个方面入手,综合运用各种优化方法和策略。通过持续的优化和改进,能够提高组件化的整体性能,为用户提供更好的体验,同时也有助于提高项目的开发效率和质量。
331 64
|
存储 前端开发 JavaScript
如何在项目中高效地进行 Web 组件化开发
高效地进行 Web 组件化开发需要从多个方面入手,通过明确目标、合理规划、规范开发、加强测试等一系列措施,实现组件的高效管理和利用,从而提高项目的整体开发效率和质量,为用户提供更好的体验。
460 63
|
监控 安全 测试技术
如何在实际项目中应用Python Web开发的安全测试知识?
如何在实际项目中应用Python Web开发的安全测试知识?
245 61
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
832 7
|
安全 Linux 开发工具
零基础构建开源项目OpenIM桌面应用和pc web- Electron篇
OpenIM 为开发者提供开源即时通讯 SDK,作为 Twilio、Sendbird 等云服务的替代方案。借助 OpenIM,开发者可以构建安全可靠的即时通讯应用,如 WeChat、Zoom、Slack 等。 本仓库基于开源版 OpenIM SDK 开发,提供了一款基于 Electron 的即时通讯应用。您可以使用此应用程序作为 OpenIM SDK 的参考实现。本项目同时引用了 @openim/electron-client-sdk 和 @openim/wasm-client-sdk,分别为 Electron 版本和 Web 版本的 SDK,可以同时构建 PC Web 程序和桌面应用(Wi
1016 2

推荐镜像

更多