我正在使用 C#、.NET 4.5 和实体框架 http://en.wikipedia.org/wiki/ADO.NET_Entity_Framework我的项目中有 6 个。它使用 Oracle 和 SQL Server,具体取决于客户端的安装。
该方法是数据库优先,因为当我们决定将 ORM 更改为NHibernate http://en.wikipedia.org/wiki/NHibernate到实体框架 6。
映射如下所示:
ToTable(schema + ".Motorista");
Property(x => x.Criacao).HasColumnName("criacao").IsOptional();
映射中的表名和列名均采用 PascalCase,这在 SQL Server 中工作正常,但在 Oracle 中,所有名称均为大写,这会导致错误:
ORA-00942: 表或视图不存在
如果我手动将其设为大写,那么它在 Oracle 上工作正常。但由于与 SQL Server 的兼容性,我不能这样做。
使用 Oracle 时,如何让实体框架将所有名称大写?
在这种情况下我可以使用约定吗?
当数据库名称(表和列)等于类模型中的类和属性名称时,很容易引入自定义代码优先约定:
在上下文中OnModelCreating
重载,您可以添加这些行来添加如何分别从类名称和属性名称派生表名称和列名称的约定:
modelBuilder.Types().Configure
(c => c.ToTable(c.ClrType.Name.ToUpper(), schema));
modelBuilder.Properties().Configure
(c => c.HasColumnName(c.ClrPropertyInfo.Name.ToUpper()));
当然,您应该有条件地执行此操作,即在连接到 Oracle 时。例如,通过检查全局常量,例如OnOracle
你可以通过设置
ConfigurationManager.ConnectionStrings[0].ProviderName
== "System.Data.OracleClient"
在应用程序启动时。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)