Entity Framework Code First在Oracle下的伪实现(转)
为什么要说是伪实现,因为还做不到类似MsSql中那样完全的功能。Oralce中的数据库还是要我们自己手动去创建的。这里,我们舍掉了Model First中的EDMX文件,自己在代码里面写模型与映射关系,这又有点像是Code First模型了,所以我说它是一个伪实现。真正完全的Code First应该是要通过Oracle开发驱动来支持了。
通过EF来连接Oracle数据库,前提是要下载ODP.NET驱动。Google一下就找得到了。
模型

- public class Student
- {
- public Student()
- {
- this.Teachers = new HashSet<Teacher>();
- }
- public Guid ID { get; set; }
- public string Name { get; set; }
- public int StudnetNumber { get; set; }
- public bool IsMale { get; set; }
- public virtual ICollection<Teacher> Teachers { get; set; }
- }
- public class Teacher
- {
- public Teacher()
- {
- this.Students = new HashSet<Student>();
- }
- public Guid ID { get; set; }
- public string Name { get; set; }
- public virtual ICollection<Student> Students { get; set; }
- }

模型很简单,这里写了两个示例模型,Student 与Teacher,并且它们之间是多对多的关系。
主键的配制
Oralce数据库中主键有两种方式:后台通过数据库自己去生,比如:trigger+sequence结合的方式来产生自增长的主键;还有一种就是通过前台显示的给ID赋值,如ID=1来插入到数据库库中。如果你想通过前台自己手动来插入的话,要配置主键的自增长为NONE。
- HasKey(k => k.ID);
Property(p => p.ID).HasColumnName("ID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
数据类型的映射
ODP.NET能够支持大多数数据类型的自动映射,比如int,datetime,string等。但对于一些特别数据类型,比如boolean,guid,Oracle数据库中并没有对应的bit类型或是GUID类型。我们要在映射的时候显示指定。
- //GUID类型的映射
- Property(p => p.TypeCode).HasColumnName("TYPECODE").HasColumnType("GUID");
- //boolean类型的映射
- Property(p => p.IsSale).HasColumnName("ISSALE").HasColumnType("odp_internal_use_type");
关系的映射
ODP.NET能够很好的支持一对多的映射,一对多的映射就像我们在配置MsSql数据库中一样。
多对多关系的映射:因为两个多对多的表,会产生一个中间表,用来保存这两张表的主键,这就要求EF能够获得这两张表的主键。如果这两张表的主键是在数据库中通过Sequence来生成的,EF就无法获取。所以,如果要配置表之间的多对多关系,表的主键必须是通过前台显示插入的。
- HasMany(t => t.Teachers).WithMany(s => s.Students).Map(m =>
- {
- m.MapLeftKey("STUDENTID");
- m.MapRightKey("TEACHERID");
- m.ToTable("STUDENT_TEACHER", "GYOUNG");
- });
总的映射如下:

- public class StudentConfiguration : EntityTypeConfiguration<Student>
- {
- public StudentConfiguration()
- {
- HasKey(k => k.ID);
- Property(p => p.ID).HasColumnName("ID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
- //GUID类型的映射
- .HasColumnType("GUID");
- Property(p => p.Name).HasColumnName("NAME");
- //bool类型的映射
- Property(p => p.IsMale).HasColumnName("ISMALE").HasColumnType("odp_internal_use_type");
- Property(p => p.StudentNumber).HasColumnName("STUDENTNUMBER");
- HasMany(t => t.Teachers).WithMany(s => s.Students).Map(m =>
- {
- //LeftKey 当前表的主键
- m.MapLeftKey("STUDENTID");
- //RightKey 另一张表的主键
- m.MapRightKey("TEACHERID");
- //必须指定数据库架构名称
- m.ToTable("STUDENT_TEACHER", "GYOUNG");
- });
- //表名+数据库架构名
- ToTable("STUDENT", "GYOUNG");
- }
- }
- public class TeacherConfiguration : EntityTypeConfiguration<Teacher>
- {
- public TeacherConfiguration()
- {
- HasKey(k => k.ID);
- Property(p => p.ID).HasColumnName("ID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
- .HasColumnType("GUID");
- Property(p => p.Name).HasColumnName("NAME");
- ToTable("TEACHER", "GYOUNG");
- }
- }

DbContext

- public class TestContext : DbContext
- {
- public DbSet<Student> Students { get; set; }
- public DbSet<Teacher> Teachers { get; set; }
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- modelBuilder.Configurations.Add(new TeacherConfiguration()).Add(new StudentConfiguration());
- base.OnModelCreating(modelBuilder);
- }
- }

附创建表的SQL:

- -- Creating table 'TEACHERS'
- CREATE TABLE "GYOUNG"."TEACHERS" (
- "ID" RAW(16) NOT NULL,
- "NAME" NVARCHAR2(200) NULL
- );
- -- Creating table 'STUDENTS'
- CREATE TABLE "GYOUNG"."STUDENTS" (
- "ID" RAW(16) NOT NULL,
- "NAME" NVARCHAR2(200) NULL,
- "ISMALE" NUMBER(10,0) NULL,
- "STUDENTNUMBER" NUMBER(10,0) NULL
- );
- -- Creating table 'STUDENT_TEACHER'
- CREATE TABLE "GYOUNG"."STUDENT_TEACHER" (
- "STUDENTID" RAW(16) NOT NULL,
- "TEACHERID" RAW(16) NOT NULL
- );

忘记了配置,补贴一下:

- <?xml version="1.0" encoding="utf-8"?>
- <configuration>
- <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=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
- </configSections>
- <connectionStrings>
- <add name="MfTest" providerName="Oracle.DataAccess.Client" connectionString="Data Source=Gyoung;user id=test;password=123456" />
- </connectionStrings>
- <startup>
- <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
- </startup>
- <entityFramework>
- <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
- </entityFramework>
- <oracle.dataaccess.client>
- <settings>
- <add name="bool" value="edmmapping number(1,0)" />
- <add name="byte" value="edmmapping number(3,0)" />
- <add name="int16" value="edmmapping number(4,0)" />
- <add name="int32" value="edmmapping number(9,0)" />
- <add name="int64" value="edmmapping number(18,0)" />
- </settings>
- </oracle.dataaccess.client>
- </configuration>

- MfTest就是连接字符串,和SQLSERVER差不多,并没有什么关键的设计。数据库名是Gyoung,你自己要在Oracle中tnsnames.ora文件中去配置监听地址。
==================================================================================================
转自:http://www.cnblogs.com/Gyoung/archive/2013/06/12/3132630.html
Entity Framework Code First在Oracle下的伪实现(转)的更多相关文章
- Entity Framework Code First在Oracle下的伪实现
为什么要说是伪实现,因为还做不到类似MsSql中那样完全的功能.Oralce中的数据库还是要我们自己手动去创建的.这里,我们舍掉了Model First中的EDMX文件,自己在代码里面写模型与映射关系 ...
- Entity Framework Code First属性映射约定
Entity Framework Code First与数据表之间的映射方式有两种实现:Data Annotation和Fluent API.本文中采用创建Product类为例来说明tity Fram ...
- Entity Framework Code First关系映射约定
本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...
- Entity Framework Code First实体对象变动跟踪
Entity Framework Code First通过DbContext.ChangeTracker对实体对象的变动进行跟踪,实现跟踪的方式有两种:变动跟踪快照和变动跟踪代理. 变动跟踪快照:前面 ...
- Entity Framework Code First (三)Data Annotations
Entity Framework Code First 利用一种被称为约定(Conventions)优于配置(Configuration)的编程模式允许你使用自己的 domain classes 来表 ...
- Entity Framework Code First (二)Custom Conventions
---------------------------------------------------------------------------------------------------- ...
- Entity Framework Code First (一)Conventions
Entity Framework 简言之就是一个ORM(Object-Relational Mapper)框架. Code First 使得你能够通过C#的类来描述一个模型,模型如何被发现/检测就是通 ...
- Entity Framework Code First 映射继承关系
转载 http://www.th7.cn/Program/net/201301/122153.shtml Code First如何处理类之间的继承关系.Entity Framework Code Fi ...
- Entity Framework Code First主外键关系映射约定
本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...
随机推荐
- Unity中SendMessage和Delegate效率比较
网上直接搜的代码.需要的使用也简单,所以就不过多说明. 但是网上都说,他们之间的差距,delegate比较快,效果高.怎么个高法呢?还是自己来测试下时间. 故此, 个人之用来比较下时间差别. 一.直接 ...
- 百度地图sdk问题 error inflating class com.baidu.mapapi.map.mapview
最近在封装开发中,有机会遇到问题还是记录下吧 但是其实都是一个原因 就是 初始化 在MyAplication onCreate()中加入 SDKInitializer.initialize(get ...
- C语言100个经典的算法之兔子总数计算内含printf的用法
语言的学习基础,100个经典的算法 C语言的学习要从基础开始,这里是100个经典的算法-1C语言的学习要从基础开始,这里是100个经典的算法 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一 ...
- console.log篇
前言: 从接触变成开始,就用到了神奇的“console.log”,原来其中还有很多不为自己知道的“小秘密”,今天就深入研究一下吧 1.可以F12打开控制台,输入console.log(xxx),就可以 ...
- Anfroid 在界面中显示图片 ImageView
ImageView1.什么是ImageView是显示图片的一个控件2.ImageView属性android:src ImageView的内容颜色 android:background ImageVie ...
- SpringMVC配置session过期拦截器,返回登录页面
spring-mvc.xml配置 <mvc:interceptors> <!-- session失效拦截器 --> <mvc:interceptor> <!- ...
- eclipse的.properties文件中文显示问题
eclipse的.properties文件,默认的编码方式是iso-8859-1. 所以中文显示有问题. 按照下面的方式,把Default Encoding修改成UTF-8就可以了.
- 让你变成ASP木马高手
.名称:如何制作图片ASP木马 (可显示图片) 建一个asp文件,内容为<!--#i nclude file="ating.jpg"--> 找一个正常图片ating.j ...
- LeetCode - Nth Highest Salary
题目大概意思是要求找出第n高的Salary,直接写一个Function.作为一个SQL新手我学到了1.SQL中Function的写法和变量的定义,取值.2.limit查询分 页的方法. 在这个题 ...
- MongoDb Mmap引擎分析
版权声明:本文由孔德雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/137 来源:腾云阁 https://www.qclo ...