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


    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:appouqjproduct11.2.0dbhome_1NETWORKADMIN

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

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

    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表中没有对应的记录,删除无用记录即可。

  • 相关阅读:
    @Configuration和@Component区别
    ElasticSearch中text和keyword类型的区别
    Elasticsearch实战篇——Spring Boot整合ElasticSearch
    Elasticsearch入门篇——基础知识2
    学习Elasticsea从零学Elasticsearch系列——基础概念rch系列——(1)基础概念
    开发工具:IDEA类和方法注释模板设置(非常详细)
    项目中时间的处理,到最后的数据库
    详细刨析---电商系统之订单系统设计
    记录一下自己用springboot整合阿里巴巴开源的EasyExcel实现导入导出功能
    Springboot整合easyExcel导入导出Excel
  • 原文地址:https://www.cnblogs.com/jiekzou/p/5511100.html
Copyright © 2020-2023  润新知