Entity Framework 6.x Code Frist For Oracle 实践与注意点
Entity Framework 6.x Code Frist For Oracle 实践与注意点
开发环境
Visual Studio.net 2015/2017
Oracle 11g/12c 数据库
Oracle Client 可以不安装
Asp.net mvc Project
Nuget 组件
- EntityFramework 6.1.3
- Oracle.ManagedDataAccess 12.1.2400
- Oracle.ManagedDataAccess.EntityFramework 12.1.2400
Entity Framework web.config配置
通过nuget安装以上3个组件后,visual studio.net会自动修改web.config的配置信息,会添加以下内容
|
<configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> </configSections> |
|
<entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> </providers> </entityFramework> |
|
<system.data> <DbProviderFactories> <remove invariant="Oracle.ManagedDataAccess.Client" /> <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> </DbProviderFactories> </system.data> |
|
<oracle.manageddataaccess.client> <version number="*"> <dataSources> <dataSource alias="SampleDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.20.70.242)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))" /> </dataSources> </version> </oracle.manageddataaccess.client> <connectionStrings> <add name="OracleDbContext" providerName="Oracle.ManagedDataAccess.Client" connectionString="User Id=C##EF1;Password=ef1;Data Source=SampleDataSource" /> </connectionStrings> |
有了oracle.manageddataaccess.client就不需要安装Oracle客户端了,descriptpor修改成需要连接的Oracle数据库实例就可以了
创建Model/DbContext
|
public class Blog { public int BlogId { get; set; } [MaxLength(50)] public string Url { get; set; } } |
|
public class MyDbContext: DbContext { public MyDbContext() : base("Name=OracleDbContext") { Database.SetInitializer<MyDbContext>(null); } public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { //注意:Oracle必须定义成用户名/所有者或是称Schema,(SQL默认是dbo) modelBuilder.HasDefaultSchema("C##EF1"); //注意:Oracle必须把所有mapping的字段名转换成大写,否则无法在pl/sql developer中用sql查询 modelBuilder.Properties().Configure(x => x.HasColumnName(x.ClrPropertyInfo.Name.ToUpper())); //注意:Oracle必须把所有mapping的数据库表名转换成大写,否则无法在pl/sql developer中用sql查询 modelBuilder.Types().Configure(c => c.ToTable(c.ClrType.Name.ToUpper())); 长度/NVARCHAR2类型,否则系统会自动创建成NCLOG类型 modelBuilder.Properties<string>().Configure(c => c.HasMaxLength(250)); modelBuilder.Properties<string>().Configure(c => c.HasColumnType("NVARCHAR2")); } } |
protected override void OnModelCreating(DbModelBuilder modelBuilder) 可以设定非常多自定义属性,比如ID/主键/一对多/级联删除/命名规则等,具体可以参考以下内容
Entity Framework Fluent API - Configuring and Mapping Properties and Types
Entity Framework Custom Code First Conventions (EF6 onwards)
创建表/同步更新表结构
执行Code first 命令
- Run the Enable-Migrations command in Package Manager Console
- Add-Migration will scaffold the next migration based on changes you have made to your model since the last migration was created
- Update-Database -script will apply any pending migrations to the database
注意:Update-Database -script 系统会生成数据库的DDL脚本,这样可以方便做一些调整后再执行更新到数据库
如果需要多个库(开发库/测试库/生产库)同步更新就可以通过修改脚本来实现
推荐nugate组件
PM> Install-Package Z.EntityFramework.Plus.EF6
PM> Install-Package Z.EntityFramework.Plus.EFCore
PM> Install-Package Z.ExtensionMethods
都是非常好用的扩展类库
Entity Framework 6.x Code Frist For Oracle 实践与注意点的更多相关文章
- 将 Entity Framework、LINQ 和 Model-First 用于 Oracle 数据库
目的 本教程介绍如何使用 Entity Framework.语言集成查询 (LINQ),以及如何对 Oracle 数据库使用 Model-First 以生成数据定义语言 (DDL) 脚本. 所需时间 ...
- Entity Framework工具POCO Code First Generator的使用
在使用Entity Framework过程中,有时需要借助工具生成Code First的代码,而Entity Framework Reverse POCO Code First Generator是一 ...
- Entity Framework工具POCO Code First Generator的使用(参考链接:https://github.com/sjh37/EntityFramework-Reverse-POCO-Code-First-Generator)
在使用Entity Framework过程中,有时需要借助工具生成Code First的代码,而Entity Framework Reverse POCO Code First Generator是一 ...
- 学习Entity Framework 中的Code First
这是上周就写好的文章,是在公司浩哥的建议下写的,本来是部门里面分享求创新用的,这里贴出来分享给大家. 最近在对MVC的学习过程中,接触到了Code First这种新的设计模式,感觉很新颖,并且也体验到 ...
- 转载:学习Entity Framework 中的Code First
看完觉得不错,适合作为学习资料,就转载过来了 原文链接:http://www.cnblogs.com/Wayou/archive/2012/09/20/EF_CodeFirst.html 这是上周就写 ...
- Entity Framework(EF的Code First方法)
EntityFramework,是Microsoft的一款ORM(Object-Relation-Mapping)框架.同其它ORM(如,NHibernate,Hibernate)一样, 一是为了使开 ...
- Entity Framework应用:Code First的实体继承模式
Entity Framework的Code First模式有三种实体继承模式 1.Table per Type (TPT)继承 2.Table per Class Hierarchy(TPH)继承 3 ...
- Entity Framework应用:Code First模式数据迁移的基本用法
使用Entity Framework的Code First模式在进行数据迁移的时候会遇到一些问题,熟记一些常用的命令很重要,下面整理出了数据迁移时常用的一些命令. 一.模型设计 EF默认使用id字段作 ...
- Entity Framework 6.0 Code First(转)
源自:http://www.cnblogs.com/panchunting/tag/Code%20First/ 1 Conventions 2 Custom Conventions 3 Data An ...
随机推荐
- jsp-javabean练习1
package javaBean; public class JavaB2 { private String name="lhy"; private int xuehao=123; ...
- 1795. Table tennis
#include<iostream>#include<cmath> using namespace std;int main(){ int n; cin>>n; w ...
- Java 第14章 字符串
字符串 基本数据类型和引用数据类型作为方法参数 ,在传递时有什么不同之处. 答:基本数据类型按值传递,相当于复制了一份过去. 引用数据类型是指向引用 内存地址,两个地方 根据地址使用同一份数据,如被更 ...
- Nginx 常用伪静态配置
1. /a/b?c=d => index.php?_a=a&_m=b&c=d 2. /xxx/detail-yyy.html => index.php?_a=xxx& ...
- 什么是领域驱动设计(Domain Driven Design)?
本文是从 What is Domain Driven Design? 这篇文章翻译而来. ”…在很多领域,专家的作用体现在他们的专业知识上而不是智力上.“ -- Don Reinertsen 领域驱动 ...
- 借助Process Explorer定位断电未保存的录音文件
话说某大神(大婶)开会常偷懒,用Windows自带的录音机进行录音并用记事本记录会议精要却没有点击Ctrl+S的习惯,结果就给我找了今天的难题.(之前都是Office的自动保存在哪里……) 还是一样, ...
- Circle3Quit数到三的人退出
public class Circle3Quit {public static void main(String args[]) {boolean arr[] = new boolean[500];/ ...
- Swift经典知识整理
1 关于Swift Swift 是一种适用于 iOS 和 OS X 应用的全新编程语言,它建立在最好的 C 和 Objective-C 语言之上,并且没有 C 语言的兼容性限制.Swift 采用安全 ...
- Asp.Net Web API 2第五课——Web API路由
Asp.Net Web API 导航 Asp.Net Web API第一课——入门 http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web ...
- Android开源项目分包方式学习(eoe、oschina、github)
总感觉Android中关于分包的文章很少,或者几乎可以说没有.但是合理地分包,又可以使整个项目模块化,减少包与包之间的依赖,让整个项目的框架更加清晰,更利于后续功能的拓展. 因为没有相关的文章,所以这 ...