Oracle中使用Entity Framework 6.x Code-First方式开发

时间:2023-09-20 13:40:38

去年写过一篇EF的简单学习笔记,当时EF还不支持Oracle的Code-First开发模式,今天无意又看了下Oracle官网,发现EF6.X已经支持了,并且给出了二篇教程(英文版):

1.Using NuGet to Install and Configure Oracle Data Provider for .NET

2.Entity Framework Code First and Code First Migrations for Oracle Database

基本上照着做就行了,为了方便不愿意啃英文的朋友,把主要步骤"意译"了下:

环境: Visual Studio 2013 + .Net Framework 4.5.2

1. 使用NuGet安装、配置ODP.NET

a) 参考下图,创建一个Console Application的项目

Oracle中使用Entity Framework 6.x Code-First方式开发

项目名称随便吧,图中是NuGet

Oracle中使用Entity Framework 6.x Code-First方式开发

这是主程序入口

Oracle中使用Entity Framework 6.x Code-First方式开发

b) 打开Solution 视图

Oracle中使用Entity Framework 6.x Code-First方式开发

项目的References引用节点右击,选择Manage NuGet Packages...

Oracle中使用Entity Framework 6.x Code-First方式开发

参考下图,搜索Oracle,安装图中的二项:

Oracle中使用Entity Framework 6.x Code-First方式开发

安装过程中,会弹出License对话框,点击I Accept

Oracle中使用Entity Framework 6.x Code-First方式开发

安装成功后,这二项应该会自动打上绿勾

Oracle中使用Entity Framework 6.x Code-First方式开发

安装完成后,会自动打开readme.txt,地球人一般都不看这玩意儿

Oracle中使用Entity Framework 6.x Code-First方式开发

检查下项目的References,参考下图,应该看到自动添加了4个新的dll引用

Oracle中使用Entity Framework 6.x Code-First方式开发

再看下App.config

Oracle中使用Entity Framework 6.x Code-First方式开发

会自动添加以下内容:

Oracle中使用Entity Framework 6.x Code-First方式开发

下图这二个地方,是用来配置连接字符串的,记得修改

Oracle中使用Entity Framework 6.x Code-First方式开发

ok, ODP.Net安装配置完成

2.使用Code First模式开发

a) 先参考下图,修改连接字符串(本文用的是HR这个示例用户,大家可以根据实际情况修改)

Oracle中使用Entity Framework 6.x Code-First方式开发

打开Program.cs这个文件

Oracle中使用Entity Framework 6.x Code-First方式开发

换成下面这段代码:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Data.Common;
using System.Data.Entity;
using System.Data.Entity.Core.Objects;
using System.Data.Entity.Migrations;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.Migrations.History;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; namespace EFCodeFirst
{
class Program
{
static void Main(string[] args)
{
Database.SetInitializer(new DropCreateDatabaseAlways<OracleDbContext>()); using (var ctx = new OracleDbContext())
{
var emp = new Employee
{
Name = "Tom",
HireDate = DateTime.Now
}; ctx.Employees.Add(emp);
ctx.SaveChanges(); var dept = new Department
{
Name = "Accounting",
ManagerId = emp.EmployeeId
}; ctx.Departments.Add(dept);
ctx.SaveChanges();
} Console.Write("Press any key to continue... ");
Console.ReadLine();
}
} public class Employee
{
public int EmployeeId { get; set; }
public string Name { get; set; }
public DateTime HireDate { get; set; }
//public string Location { get; set; }
} public class Department
{
public int DepartmentId { get; set; }
public string Name { get; set; }
[ForeignKey("Manager")]
public int ManagerId { get; set; }
public Employee Manager { get; set; }
} public class OracleDbContext : DbContext
{
public DbSet<Employee> Employees { get; set; }
public DbSet<Department> Departments { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("HR");
}
}
}

下面是主要的调用代码,演示了insert记录

Oracle中使用Entity Framework 6.x Code-First方式开发

下面是实体类的定义,完全是POJO对象,可以借助工具或纯手写.

Oracle中使用Entity Framework 6.x Code-First方式开发

下面是DbContext部分,相当于DAL层.注意:OnModelCreating,这里表示根据Model创建表时,默认将创建到HR这个Database Schema下

Oracle中使用Entity Framework 6.x Code-First方式开发

运行结果

Oracle中使用Entity Framework 6.x Code-First方式开发

打开Server Explorer面板

Oracle中使用Entity Framework 6.x Code-First方式开发

连接到Oracle

Oracle中使用Entity Framework 6.x Code-First方式开发

可以看到根据Model定义,自动生成了二张表(注意下表名,自动加了复数)

Oracle中使用Entity Framework 6.x Code-First方式开发

可以直接查看数据

Oracle中使用Entity Framework 6.x Code-First方式开发

Oracle中使用Entity Framework 6.x Code-First方式开发

可以看到,成功插入了2条数据

Oracle中使用Entity Framework 6.x Code-First方式开发

Oracle中使用Entity Framework 6.x Code-First方式开发

b) Model与数据库的迁移合并

数据实体模型的类定义,往往随着需求的变化而变化,如果增加或减少了属性,EF可以自动生成相应的db脚本,同步修改表结构

先参考下图,进入PM控制台

Oracle中使用Entity Framework 6.x Code-First方式开发

输入Enable-Migrations启用数据库迁移功能

Oracle中使用Entity Framework 6.x Code-First方式开发

然后将Employee的类定义,把原来注释掉的Location属性行,去掉注释(即:增加了Location属性)

Oracle中使用Entity Framework 6.x Code-First方式开发

回到PM控制台,输入Add-Migration First 生成相应的db修改脚本

Oracle中使用Entity Framework 6.x Code-First方式开发

最后输入Update-Database更新表结构

Oracle中使用Entity Framework 6.x Code-First方式开发

打开Server Explorer视图,查看下Employees表

Oracle中使用Entity Framework 6.x Code-First方式开发

可以发现,已经增加了新字段Location

Oracle中使用Entity Framework 6.x Code-First方式开发