我们知道Oracle不像SqlServer那样,支持原生的自动增长型,而是通过sequence来实现类似于自增长类型的效果。

对于以项目为主的公司而言,往往需要做到数据库之间的切换。而当初引入Entity Framework,一个重要的目标就是不同数据库之间的快速切换。

现在面临的一个问题就是:自增长类型,如果做到不用修改代码,就能支持无缝切换

 

说句题外话,关于主键类型的选择

1. 自增长类型

优:简单、查找方便、空间占用少

缺:不同类型数据库的支持不同、数据同步

2. Guid 的string

优:数据同步较方便

缺:占用空间大——一般用32个字符,查找不便——没有先后次序规律

3. 自定义的生成规则

 

嗯,不管你们用什么类型的主键,反正我是需要改造一下EFOracleProvider来支持如下的功能

var entity = new XX();
//去掉设置主键值
//entity.ID = 20;
entity.Column1 = something;

//dbContext.Add(entity);

在动手前,我们需要先约定以下规则:

1. 所有表的主键名称统一叫ID

2. 为每个表建立一个序列(sequence),规则是 SEQ_表名(序列的名字长度不能超过30个字符,所以表名不要超过26个字符)

 

完成该功能,需要修改以下3个文件(共4处地方)

1. Resources\EFOracleStoreSchemaDefinition.ssdl 

2. SqlGen\DmlSqlGenerator.cs 

3. SqlGen\SqlGenerator.cs 

 

1. 修改 EFOracleStoreSchemaDefinition.ssdl

定位到第36行,将

          , 0                     "IsIdentity"

修改为:

          , case c.COLUMN_NAME when 'ID' then 1 else 0 end                     "IsIdentity" 

目的在于,告诉生成工具(edmgen2,网上搜) ,如果是ID字段,在edmx文件中,加入

<Property Name="ID" Type="number" Nullable="false" Precision="10" />

变成 

<Property Name="ID" Type="number" Nullable="false" Precision="10" StoreGeneratedPattern="Identity" />

 

2. 修改insert语句的生成规则,在DmlSqlGenerator.cs文件中,找到GenerateInsertSql方法,然后用如下代码替换

return commandText.ToString();

相关文章:

  • 2021-12-13
  • 2022-12-23
  • 2021-08-24
  • 2022-12-23
  • 2022-12-23
  • 2021-09-25
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-09-08
  • 2022-12-23
  • 2022-12-23
  • 2022-01-03
  • 2021-10-01
相关资源
相似解决方案