将EF项目从dbfirst转化为codefirst

一个脚本服务的项目,之前是先设计的数据库表,采用EF的dbfirst做的映射。项目完成后,出现迁移瓶颈。

1、dbfirst项目,如果数据库表结构做了调整,需要重新映射

2、当出现表结构一致,但数据库用户及密码发生变化时,原dbfirst映射无法适应新数据库,需要重新建立dbfirst映射。不易于迁移

考虑这个脚本服务的目地是:

1、采用EF6 codefirst(废弃dbfirst)
2、目前脚本服务器以承载库是oracle,解决了oracle版本不一致造成兼容性问题
3、可以直接将发布版的脚本服务器随意迁移至其他服务器或新建为多个脚本服务
4、oracle数据库地址发生变化时,直接在配置文件中修改数据库链接地址和Database.Schema



我在将该项目从dbfirst迁移到codefirst的步骤如下:

1、升级项目。由于我原来项目是FM4.0、EF5.0 用vs2012开发的,现在将项目升级为FM4.5、EF6,故新建了一个类库,创建了一个ADO.NET实体数据模型。用于自动引用EF6相关dll文件。之后删除  XX.edmx

2、copy映射实体类。建立新文件夹Entity,拷贝在dbfirst中生成实体映射类至该目录下

3、加工dbfirst而来的实体类。为主键加入[Key]特性,为外键加入[ForeignKey("外键字段的属性名")]。如下:

namespace Easyman.Service
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;

    public partial class EM_SCRIPT_REF_NODE
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
        public long ID { get; set; }
        public Nullable<long> SCRIPT_ID { get; set; }
        public Nullable<long> PARENT_NODE_ID { get; set; }
        public Nullable<long> CURR_NODE_ID { get; set; }
        public string REMARK { get; set; }

        [ForeignKey("SCRIPT_ID")]
        public virtual EM_SCRIPT EM_SCRIPT { get; set; }
    }
}

4、新建DBEntities类,继承DbContext。代码参照如下:

namespace Easyman.Service
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    using System.Configuration;
    using System.Data.Common;

    public partial class DBEntities : DbContext
    {
        public DBEntities()
            :  base("name=DBEntities")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //var schema = ConfigurationManager.AppSettings["Database.Schema"];
            var schema = ConfigurationSettings.AppSettings["Database.Schema"];
            modelBuilder.HasDefaultSchema(schema);
            base.OnModelCreating(modelBuilder);
        }

        public DbSet<EM_ANALYSIS> EM_ANALYSIS { get; set; }
        public DbSet<EM_CONNECT_LINE> EM_CONNECT_LINE { get; set; }
    }
}

 5、接下来是配置文件:配置数据链接、Schema用户名,同时解决oracle版本兼容和驱动问题

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=301880
  -->
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <!--<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />-->
      <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </providers>
  </entityFramework>
  <appSettings>
    <!--以下是脚本服务名称配置信息 -->
    <!--脚本服务器描述文字 -->
    <add key="Description" value="开发三部的脚本服务器" />
    <!--脚本服务显示的名称 -->
    <add key="DisplayName" value="Easyman3Script" />
    <!--脚本服务的服务名 -->
    <add key="ServiceName" value="Easyman3Script" />
    <!--以下是数据库用户名Schema -->
    <add key="Database.Schema" value="C##ABPBASE" />
  </appSettings>
  <connectionStrings>
    <add name="DBEntities" connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xx.xx.xx.xx)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)));User ID=C##ABPBASE;Password=C##ABPBASE;Persist Security Info=True" providerName="Oracle.ManagedDataAccess.Client" />
  </connectionStrings>

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Common.Logging" publicKeyToken="af08829b84f0328e" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-3.2.0.0" newVersion="3.2.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-1.2.13.0" newVersion="1.2.13.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Common.Logging.Core" publicKeyToken="af08829b84f0328e" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-3.2.0.0" newVersion="3.2.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

  <system.data>
    <DbProviderFactories>
      <remove invariant="Oracle.ManagedDataAccess.Client" />
      <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>
  <oracle.manageddataaccess.client>
    <version number="*">
      <dataSources>
        <dataSource alias="SampleDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) " />
      </dataSources>
    </version>
  </oracle.manageddataaccess.client>
</configuration>

以上步骤完成后,项目能够正常生成。运行过程出现的问题:

1、数据库版本问题

其他信息: 无法为具有固定名称“Oracle.ManagedDataAccess.Client”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342”。请确保使用限定程序集的名称且该程序集对运行的应用程序可用。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=260882。

解决方式:引用oracle官方新出的dll文件Oracle.ManagedDataAccess.dll 和 Oracle.ManagedDataAccess.EntityFramework.dll

下载地址:oracle.dll.zip

参考链接:Entity Framework6 with Oracle(可实现code first)

2、能够通过EF查询数据,但是向数据库写入数据时,明明给主键ID赋值了,但是总是提示传入的主键ID为空值。错误提示如下:

ORA-01400: 无法将 NULL 插入 ("C##ABPBASE"."EM_SCRIPT_CASE_LOG"."ID")
ORA-06512: 在 line 4

参考网站:Entity Framework Code First 遭遇主键自动生成问题

原因:由于EF的codefirst默认设置表的主键ID为identity,不会将赋给主键ID的值传入数据库,而是由数据库自增去赋值。

这种情况有两种应对方式:

1)保留默认的identity,在表上建立主键的自增,如果是oracle则设置default。如下
"C##ABPBASE"."EM_SCRIPT_CASE_SEQ".nextval

2)有选择性的取消实体类的identity,表的主键值由用户自己去赋值。配置如下:
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]

时间: 2024-10-13 15:27:58

将EF项目从dbfirst转化为codefirst的相关文章

一步步学习EF Core(1.DBFirst)

前言 很久没写博客了,因为真的很忙,终于空下来,打算学习一下EF Core顺便写个系列, 今天我们就来看看第一篇DBFirst. 本文环境:VS2017  Win7  .NET Core1.1    EF Core1.1.2 正文 这里我们不讨论是用DBFirst好,还是CodeFirst高端..各有各自的用处和适用场景.. 我们单纯的只是来使用这个DBFirst.. 既然是DBFirst,那么在用DBFirst之前..首先你要有一个数据库(嗯,废话) 其次,如果你是Windows7系统 那么需

EF 项目的实施的几个重点。

EF 项目的实施的几个重点: 1) EF 的配置在 WEB.config 或者 APP.config 1)  引人 ENTITY FRAMEWORK 节 (Section): 2)  在 ENTITY FRAMEWORK 描述节 引入  PROVIDER: 加入 默认 的 PROVIDERSERVICE (主要是 MS SQL 使用) 3) 引入  CONNECTSTRING 连接字符串. SQL 的示例: <?xml version="1.0" encoding="u

《MVC+EF》——用DBFirst创建ADO.NET实体数据模型和对象关系映射

转载于:http://blog.csdn.net/zhoukun1008/article/details/50528145 现在越来越喜欢MVC了,不光是因为ITOO中用到了他,而是因为它里面包含了很多的知识点让我们去学习,我们的ITOO在服务端用到了EF和WCF,而对于MVC来说,他也可以与EF合作操作数据库,也可以像WebForm一样为用户显示数据.下面我总结一下用DBFirst来创建实体数据库模型. 1.新建ASP.NET MVC 4 Web 应用程序 2.创建空的模板 3.创建ADO.n

【C#】EF学习&lt;二&gt; DbFirst (先创建数据库,表及其关联关系)

工程压缩文件放到百度云盘---20181019001文件夹 1. 创建表的脚本 create table Teacher ( TID char(12) primary key, Tname char(6) not null ) create table Student ( SID char(12) primary key, Sname char(6) not null, Sage INT not null, Ssex char(2) check(Ssex between ' 男' and '女'

1.通用框架第一步FINEUI+EF项目创建

开发工具:VS2012 数据库:SQL Server 2008 .NET Framework版本:4.0 UI框架:FineUI(开源)4.2.3 创建整体项目如下 Service:数据操作层 Business:业务层 Common:通用类库 UI:界面 集成FineUI到项目中 1.添加FineUI类库如下 类库下载地址链接: http://pan.baidu.com/s/1pL7t9WJ 密码: fyn6 2.添加ExtJS以及资源相关文件如下 资源文件下载地址链接: http://pan.

基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入

概述 上一章,我们简单的搭建了依赖注入的三层架构,但是,没有真正的使用,而我们现在就使用MySQL数据,基于 EF Core 的 DbFirst 进行框架搭建. 微软爸爸官方文档:使用新数据库在 ASP.NET Core 上开始使用 EF Core    数据库表字段命名规范 步骤 1. 右击 Entity 项目,点击"管理NuGet程序包" 2. 安装以下三个包 Microsoft.EntityFrameworkCore     安装版本:2.1.0 Microsoft.Entity

Oracle中使用Entity Framework 6.x Code-First

Oracle中使用Entity Framework 6.x Code-First方式开发 去年写过一篇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

《一步一步使用ABP框架搭建正式项目系列教程》

这一节我们说说数据库迁移(Migration). 我们之前用的DBFirst创建了实体类,但当初这么做的原因是为了节省时间.现在我们通过创建的实体类和DbContext类利用EF的Code First数据库迁移反过来创建数据库.ABP模板默认开启了迁移,并且添加了一下下面的Configuration类: 1 using EntityFramework.DynamicFilters; 2 using System.Data.Entity.Migrations; 3 using Witcare.PS

.NET ORM 开源项目 FreeSql 1.0 正式版发布

一.简介 FreeSql 是 .NET 平台下的对象关系映射技术(O/RM),支持 .NetCore 2.1+ 或 .NetFramework 4.0+ 或 Xamarin. 从 0.0.1 发布,历时整整一年的迭代更新,原计划元旦发布1.0,可能作者比较急提前了几天发布.其实是元旦有其他事-- 本文内容从简,介绍项目的主要功能框架,以及暂时能想到的可能比较有说服力的特性. 二.项目统计 主仓库解决方案共计项目:29个 单元测试:3510个 Code Issues:168个 文档Wiki:43个