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);
        }

未完。。。

原文地址:https://www.cnblogs.com/hankuikui/p/7230094.html