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

通过EF来连接Oracle数据库,前提是要下载ODP.NET驱动。Google一下就找得到了。

模型

  1. public class Student
  2. {
  3. public Student()
  4. {
  5. this.Teachers = new HashSet<Teacher>();
  6. }
  7.  
  8. public Guid ID { get; set; }
  9. public string Name { get; set; }
  10. public int StudnetNumber { get; set; }
  11. public bool IsMale { get; set; }
  12.  
  13. public virtual ICollection<Teacher> Teachers { get; set; }
  14. }
  15.  
  16. public class Teacher
  17. {
  18. public Teacher()
  19. {
  20. this.Students = new HashSet<Student>();
  21. }
  22. public Guid ID { get; set; }
  23. public string Name { get; set; }
  24. public virtual ICollection<Student> Students { get; set; }
  25. }

模型很简单,这里写了两个示例模型,Student 与Teacher,并且它们之间是多对多的关系。

主键的配制

Oralce数据库中主键有两种方式:后台通过数据库自己去生,比如:trigger+sequence结合的方式来产生自增长的主键;还有一种就是通过前台显示的给ID赋值,如ID=1来插入到数据库库中。如果你想通过前台自己手动来插入的话,要配置主键的自增长为NONE。

  1. HasKey(k => k.ID);
    Property(p => p.ID).HasColumnName("ID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

数据类型的映射

ODP.NET能够支持大多数数据类型的自动映射,比如int,datetime,string等。但对于一些特别数据类型,比如boolean,guid,Oracle数据库中并没有对应的bit类型或是GUID类型。我们要在映射的时候显示指定。

  1. //GUID类型的映射
  2. Property(p => p.TypeCode).HasColumnName("TYPECODE").HasColumnType("GUID");
  3. //boolean类型的映射
  4. Property(p => p.IsSale).HasColumnName("ISSALE").HasColumnType("odp_internal_use_type");

关系的映射

ODP.NET能够很好的支持一对多的映射,一对多的映射就像我们在配置MsSql数据库中一样。

多对多关系的映射:因为两个多对多的表,会产生一个中间表,用来保存这两张表的主键,这就要求EF能够获得这两张表的主键。如果这两张表的主键是在数据库中通过Sequence来生成的,EF就无法获取。所以,如果要配置表之间的多对多关系,表的主键必须是通过前台显示插入的。

  1. HasMany(t => t.Teachers).WithMany(s => s.Students).Map(m =>
  2. {
  3. m.MapLeftKey("STUDENTID");
  4. m.MapRightKey("TEACHERID");
  5. m.ToTable("STUDENT_TEACHER", "GYOUNG");
  6. });

总的映射如下:

  1. public class StudentConfiguration : EntityTypeConfiguration<Student>
  2. {
  3. public StudentConfiguration()
  4. {
  5. HasKey(k => k.ID);
  6. Property(p => p.ID).HasColumnName("ID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
  7. //GUID类型的映射
  8. .HasColumnType("GUID");
  9. Property(p => p.Name).HasColumnName("NAME");
  10. //bool类型的映射
  11. Property(p => p.IsMale).HasColumnName("ISMALE").HasColumnType("odp_internal_use_type");
  12. Property(p => p.StudentNumber).HasColumnName("STUDENTNUMBER");
  13.  
  14. HasMany(t => t.Teachers).WithMany(s => s.Students).Map(m =>
  15. {
  16. //LeftKey 当前表的主键
  17. m.MapLeftKey("STUDENTID");
  18. //RightKey 另一张表的主键
  19. m.MapRightKey("TEACHERID");
  20. //必须指定数据库架构名称
  21. m.ToTable("STUDENT_TEACHER", "GYOUNG");
  22. });
  23.  
  24. //表名+数据库架构名
  25. ToTable("STUDENT", "GYOUNG");
  26. }
  27. }
  28.  
  29. public class TeacherConfiguration : EntityTypeConfiguration<Teacher>
  30. {
  31. public TeacherConfiguration()
  32. {
  33. HasKey(k => k.ID);
  34. Property(p => p.ID).HasColumnName("ID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
  35. .HasColumnType("GUID");
  36. Property(p => p.Name).HasColumnName("NAME");
  37. ToTable("TEACHER", "GYOUNG");
  38. }
  39. }

DbContext

  1. public class TestContext : DbContext
  2. {
  3. public DbSet<Student> Students { get; set; }
  4. public DbSet<Teacher> Teachers { get; set; }
  5.  
  6. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  7. {
  8. modelBuilder.Configurations.Add(new TeacherConfiguration()).Add(new StudentConfiguration());
  9. base.OnModelCreating(modelBuilder);
  10. }
  11.  
  12. }

附创建表的SQL:

  1. -- Creating table 'TEACHERS'
  2. CREATE TABLE "GYOUNG"."TEACHERS" (
  3. "ID" RAW(16) NOT NULL,
  4. "NAME" NVARCHAR2(200) NULL
  5. );
  6.  
  7. -- Creating table 'STUDENTS'
  8. CREATE TABLE "GYOUNG"."STUDENTS" (
  9. "ID" RAW(16) NOT NULL,
  10. "NAME" NVARCHAR2(200) NULL,
  11. "ISMALE" NUMBER(10,0) NULL,
  12. "STUDENTNUMBER" NUMBER(10,0) NULL
  13. );
  14.  
  15. -- Creating table 'STUDENT_TEACHER'
  16. CREATE TABLE "GYOUNG"."STUDENT_TEACHER" (
  17. "STUDENTID" RAW(16) NOT NULL,
  18. "TEACHERID" RAW(16) NOT NULL
  19. );

忘记了配置,补贴一下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <configuration>
  3. <configSections>
  4. <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  5. <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  6. </configSections>
  7. <connectionStrings>
  8. <add name="MfTest" providerName="Oracle.DataAccess.Client" connectionString="Data Source=Gyoung;user id=test;password=123456" />
  9. </connectionStrings>
  10. <startup>
  11. <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  12. </startup>
  13. <entityFramework>
  14. <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  15. </entityFramework>
  16. <oracle.dataaccess.client>
  17. <settings>
  18. <add name="bool" value="edmmapping number(1,0)" />
  19. <add name="byte" value="edmmapping number(3,0)" />
  20. <add name="int16" value="edmmapping number(4,0)" />
  21. <add name="int32" value="edmmapping number(9,0)" />
  22. <add name="int64" value="edmmapping number(18,0)" />
  23. </settings>
  24. </oracle.dataaccess.client>
  25. </configuration>
  1. MfTest就是连接字符串,和SQLSERVER差不多,并没有什么关键的设计。数据库名是Gyoung,你自己要在Oracletnsnames.ora文件中去配置监听地址。
    ==================================================================================================
    转自:http://www.cnblogs.com/Gyoung/archive/2013/06/12/3132630.html

Entity Framework Code First在Oracle下的伪实现(转)的更多相关文章

  1. Entity Framework Code First在Oracle下的伪实现

    为什么要说是伪实现,因为还做不到类似MsSql中那样完全的功能.Oralce中的数据库还是要我们自己手动去创建的.这里,我们舍掉了Model First中的EDMX文件,自己在代码里面写模型与映射关系 ...

  2. Entity Framework Code First属性映射约定

    Entity Framework Code First与数据表之间的映射方式有两种实现:Data Annotation和Fluent API.本文中采用创建Product类为例来说明tity Fram ...

  3. Entity Framework Code First关系映射约定

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  4. Entity Framework Code First实体对象变动跟踪

    Entity Framework Code First通过DbContext.ChangeTracker对实体对象的变动进行跟踪,实现跟踪的方式有两种:变动跟踪快照和变动跟踪代理. 变动跟踪快照:前面 ...

  5. Entity Framework Code First (三)Data Annotations

    Entity Framework Code First 利用一种被称为约定(Conventions)优于配置(Configuration)的编程模式允许你使用自己的 domain classes 来表 ...

  6. Entity Framework Code First (二)Custom Conventions

    ---------------------------------------------------------------------------------------------------- ...

  7. Entity Framework Code First (一)Conventions

    Entity Framework 简言之就是一个ORM(Object-Relational Mapper)框架. Code First 使得你能够通过C#的类来描述一个模型,模型如何被发现/检测就是通 ...

  8. Entity Framework Code First 映射继承关系

    转载 http://www.th7.cn/Program/net/201301/122153.shtml Code First如何处理类之间的继承关系.Entity Framework Code Fi ...

  9. Entity Framework Code First主外键关系映射约定

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

随机推荐

  1. Unity中SendMessage和Delegate效率比较

    网上直接搜的代码.需要的使用也简单,所以就不过多说明. 但是网上都说,他们之间的差距,delegate比较快,效果高.怎么个高法呢?还是自己来测试下时间. 故此, 个人之用来比较下时间差别. 一.直接 ...

  2. 百度地图sdk问题 error inflating class com.baidu.mapapi.map.mapview

    最近在封装开发中,有机会遇到问题还是记录下吧 但是其实都是一个原因  就是 初始化 在MyAplication  onCreate()中加入 SDKInitializer.initialize(get ...

  3. C语言100个经典的算法之兔子总数计算内含printf的用法

    语言的学习基础,100个经典的算法 C语言的学习要从基础开始,这里是100个经典的算法-1C语言的学习要从基础开始,这里是100个经典的算法 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一 ...

  4. console.log篇

    前言: 从接触变成开始,就用到了神奇的“console.log”,原来其中还有很多不为自己知道的“小秘密”,今天就深入研究一下吧 1.可以F12打开控制台,输入console.log(xxx),就可以 ...

  5. Anfroid 在界面中显示图片 ImageView

    ImageView1.什么是ImageView是显示图片的一个控件2.ImageView属性android:src ImageView的内容颜色 android:background ImageVie ...

  6. SpringMVC配置session过期拦截器,返回登录页面

    spring-mvc.xml配置 <mvc:interceptors> <!-- session失效拦截器 --> <mvc:interceptor> <!- ...

  7. eclipse的.properties文件中文显示问题

    eclipse的.properties文件,默认的编码方式是iso-8859-1. 所以中文显示有问题. 按照下面的方式,把Default Encoding修改成UTF-8就可以了.

  8. 让你变成ASP木马高手

    .名称:如何制作图片ASP木马 (可显示图片) 建一个asp文件,内容为<!--#i nclude file="ating.jpg"--> 找一个正常图片ating.j ...

  9. LeetCode - Nth Highest Salary

    题目大概意思是要求找出第n高的Salary,直接写一个Function.作为一个SQL新手我学到了1.SQL中Function的写法和变量的定义,取值.2.limit查询分    页的方法. 在这个题 ...

  10. MongoDb Mmap引擎分析

    版权声明:本文由孔德雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/137 来源:腾云阁 https://www.qclo ...