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); }
未完。。。