为什么要说是伪实现,因为还做不到类似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下的伪实现(转)的更多相关文章

  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. UE4射线的碰撞与绘制

    http://blog.csdn.net/qq992817263/article/details/51800657 //起点 终点 FHitResult RayGetHitResult(FVector ...

  2. php学习六:字符串

    前言:越来越觉得php的强大之处了,不紧是数组,在字符串方面也可以看出它的优势,第一:方法多,集合了js,c,c#等多门语言的方法:第二:有许多方法是其他语言不具备的,如他的模糊比较,就是其他语言所没 ...

  3. su命令cannot set groups: Operation not permitted的解决方法

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

  4. Android Runtime.getRuntime().exec

    try { // Executes the command. Process process = Runtime.getRuntime().exec(cmd); // NOTE: You can wr ...

  5. 【BZOJ1901】Zju2112 Dynamic Rankings 主席树+树状数组

    [BZOJ1901]Zju2112 Dynamic Rankings Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j ...

  6. Android - 获取SD卡的内存空间大小

    获取SD卡的内存空间大小 //获得SD卡空间的信息 File path=Environment.getExternalStorageDirectory(); StatFs statFs=new Sta ...

  7. ThinkPHP做自动登陆及异位或加密COOKIE!

    异位或加密方法: /* *登陆如果自动登陆加密 *默认是0解密状态,1是加密 *采用的方法是异位或加密 */ function encrytion($value,$type=0){ $key = md ...

  8. postgresql----Btree索引

    当表数据量越来越大时查询速度会下降,像课本目录一样,在表的条件字段上创建索引,查询时能够快速定位感兴趣的数据所在的位置.索引的好处主要有加速带条件的查询,删除,更新,加速JOIN操作,加速外键约束更新 ...

  9. RedisDesktopManager 打开报0xc000007b程序错误

    RedisDesktopManager 是一个管理redis的工具,很好用,我的电脑可以安装0.8.3版的,最新版到0.9.4了,其中经典版本是0.8.8,可惜0.8.3版之后,我的电脑安装软件后,打 ...

  10. centos7yum下载安装报:软件包与预期下载的不符。建议:运行 yum --enablerepo=updates clean metadata尝试其他镜像

    centos7yum下载安装报:软件包与预期下载的不符.建议:运行 yum --enablerepo=updates clean metadata尝试其他镜像. rm -f /var/lib/rpm/ ...