为什么要说是伪实现,因为还做不到类似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文件中去配置监听地址。

Entity Framework Code First在Oracle下的伪实现相关推荐

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

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

  2. Entity Framework Code First添加修改及删除单独实体

    对于一个单独实体的通常操作有3种:添加新的实体.修改实体以及删除实体. 1.添加新的实体 Entity Framework Code First添加新的实体通过调用DbSet.Add()方法来实现. ...

  3. ADO.NET Entity Framework -Code Fisrt 开篇(一)

    ADO.NET Entity Framework 是微软的一套实体映射框架.发布EF4.1(Entity Framework )时,又提出了代码先行的设计理念(the code comes first ...

  4. Entity Framework Code First使用者的福音 --- EF Power Tool使用记之一

    好像蛮长时间没有新文章带给大家了.前几天出差再加上忙着公司里的活儿,几乎都没时间上博客园了.今天正好有些时间,为大家简单介绍EF产品组新发布的一个牛逼的小工具--EF Power Tool(翻译的话, ...

  5. 使用Entity Framework code first, migration

    当我使用 entity framework 代码先行的使用, 有时候需要添加字段,为了同步数据库的结构,这时候需要数据库迁移,其实很简单, run 几个命令即可 找到 package manager ...

  6. ADO.NET Entity Framework -Code Fisrt (二)

    Code First 可以自动根据Model 映射来创建数据库,这点非常方便. 但是按照上一节的方式创建的表,会发现,所有字符串列都是nvarchar(max),就是说每个model的属性映射的表列都 ...

  7. Entity Framework Code First Migrations

    中文参考:https://www.cnblogs.com/panchunting/p/entity-framework-code-first-migrations.html the following ...

  8. Entity Framework Code First模式基础知识及入门实例01

    在深入学习某项技术之前,应该努力形成对此技术的总体印象,并了解其基本原理,本文的目的就在于此. 一.理解EF数据模型 EF本质上是一个ORM框架,它需要把对象映射到底层数据库中的表,为此,它使用了三个 ...

  9. entity framework core mysql,DotNet Core下使用 EntityFrameworkCore 操作MySQL (一)

    1.新建一个Core的Web项目 注意:选择的是2.0版本 添加依赖项 依赖项>右键>管理NuGet程序包 输入以下包名 MySql.Data.EntityFrameworkCore 然后 ...

最新文章

  1. 信息安全系统设计基础第十周学习总结
  2. idea编译的jsp存在哪里
  3. java中使用什么来做错误处理_JAVA基础--如何通过异常处理错误
  4. 【面试招聘】双非渣硕的秋招路
  5. Java if语句深度解析
  6. 工作84:模板字面量
  7. python脚本打包rpm_python程序打包rpm包
  8. Arthas : 在线分析诊断工具Arthas(阿尔萨斯)
  9. matlab中仿真丢包,使用MATLAB进行误比特率(BER)仿真----转载
  10. 取二维数组最大值_学习Java,你必需要知道这些——Java数组
  11. javascript css函数一设置/读取对象的属性(Style对象与CurrentStyle对象、getComputedStyle)及其小案例
  12. Java调用大华车牌识别摄像头_第三方软件调用大华网络摄像头监控
  13. 【Mybatis源码解析】Mybatis源码体系结构
  14. 无线电波传播:频段、方式、衰落|瑞利分布、瑞利衰落非复制的解释
  15. 微信小程序(底部导航)
  16. xshell安装教程
  17. 如何通过Dropbox访问iPad上的电子书库
  18. IstioCon 2022 报名中|使用 eBPF 代替 iptable 加速 Istio 数据平面
  19. kdj指标计算程序代码
  20. 阿里P8大牛,熬夜半月肛出一份Docker文档,让你分分钟搞懂Docker

热门文章

  1. elasticsearch 分片_Elasticsearch最佳实践之分片使用优化
  2. html li padding,求大神来看为li元素设置相同的padding为何padding-bottom和padding-right为多出一部分_html/css_WEB-ITnose...
  3. linux查看接口名,在linux下 怎么查看网络接口的名字? 网络接口的名字英文是什么呀?...
  4. Java多线程复习:2(线程的创建和使用)
  5. show在php,show.php
  6. python是最好的语言 永远二十岁_Python是世界上最好的语言吗?
  7. python答题系统的代码_Python考试系统自动答题(教务处)
  8. IDEA 格式化代码Reform Code快捷键无效
  9. 【iOS】通过NSURLProtocol提高Web加载速度
  10. Redis配置到本地以及可视化工具的安装运用