zoukankan      html  css  js  c++  java
  • Entity Framework 基于Oracle的code first 问题汇总

    1. 在code first 在数据库中建表时,需要指定schema, 默认是dbo, 需要改成我们的oracle登录名

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.HasDefaultSchema("BMI14");
    
                base.OnModelCreating(modelBuilder);
            }

    2. 默认情况下,实体类名就是表名可以通过DataAnnotations进行修改,可以通过FluentAPI 进行修改

        [Table("TD_SM_BILL")]
        public class TdSmBill : Entity
        {
        }

    3. 默认情况下,我们的实体字段类型如果是string, 那么生成在数据库对应字段的类型为nclob,这是我们不能接受的,需要修改,原理同上。

    [Table("TD_SM_BILL")]
        public class TdSmBill : Entity
        {
            /// <summary>
            /// 分区字段 设置数据库中areacode长度为32
            /// </summary>
    
            [StringLength(ShConsts.StringLength_32)]
            public string AreaCode { get; set; }
        }

     如果每个string类型的属性都加上这个,我们肯定要疯掉了,我找到一种简单的方式,不需要在每个属性上加注解:

    这里我默认string类型的长度为100,这样在数据库中长度就为100,当然并不是每一个数据字段都是100,这里就需要结合注解来灵活配置了。

    public class StringMaxLengthConvertion: Convention
        {
            public StringMaxLengthConvertion()
            {
    
                this.Properties().Having(p => p.PropertyType)
                    .Configure((c,a) => {
                        if (a.FullName.EndsWith("String"))
                        {
                            c.HasMaxLength(100);
                        }
                    });
            }
        }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.HasDefaultSchema("DEV");
                
                modelBuilder.Conventions.Add<StringMaxLengthConvertion>();
                modelBuilder.Conventions.Add<ColumnUpperConvertion>();
                base.OnModelCreating(modelBuilder);
            }

    4. code first生成的建表语句如下:

    create table "BMI14"."TB_HOSPITAL"
    (
        "Id" number(10, 0) not null, 
        "Name" nvarchar2(32) null, 
        constraint "PK_TB_HOSPITAL" primary key ("Id")
    )

    表名,字段都加了引号,这让我们在plsql中使用时要特意注意,不能随意的大小写混用了,且注意要加上引号才能识别,否则会报错:无法识别标识符。

    这里有三种解决方案:

    1). 使用注解,如2中的解决方案一样,使用table或column来标识

    2) 干脆表名和属性名全大写,这样生成时也就是大写的,就是有些别扭。

    3) 使用fluentAPI:

        modelBuilder.Properties<string>()
                    .Configure(c => c.HasMaxLength(500));
    
        modelBuilder.Properties<string>()
                    .Where(x => x.Name == "Name")
                    .Configure(c => c.HasMaxLength(250));

    4) 解决方法同3.   参考:https://msdn.microsoft.com/en-us/data/jj819164.aspx  

        public class ColumnUpperConvertion: Convention
        {
            public ColumnUpperConvertion()
            {
                this.Properties().Configure(a=>a.HasColumnName(a.ClrPropertyInfo.Name.ToUpper()));
            }
        }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.HasDefaultSchema("DEV");
                
                modelBuilder.Conventions.Add<StringMaxLengthConvertion>();
                modelBuilder.Conventions.Add<ColumnUpperConvertion>();
                base.OnModelCreating(modelBuilder);
            }

    未完。。。

  • 相关阅读:
    Django的mode的分组查询和聚合查询和F查询和Q查询
    Django的models操作
    django复习--学校管理系统用到的知识点梳理
    django做form表单的数据验证
    一个不错的git资源站点
    php异常处理
    laravel自定义验证
    docker从容器中怎么访问宿主机
    laravel 之jwt认证使用详解
    laravel更改默认的登录密码加密方式
  • 原文地址:https://www.cnblogs.com/hankuikui/p/7230094.html
Copyright © 2011-2022 走看看