一个脚本服务的项目,之前是先设计的数据库表,采用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)]

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

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

    前言 很久没写博客了,因为真的很忙,终于空下来,打算学习一下EF Core顺便写个系列, 今天我们就来看看第一篇DBFirst. 本文环境:VS2017  Win7  .NET Core1.1     ...

  2. 生成网上下载的EF项目对应的数据库

    生成网上下载的EF项目对应的数据库 网上下载的用EF做的小项目,结果没有配有数据库的,用VS打开来看了一下,看到Migrations文件夹,应该可以用EF命令来生成这个数据库了 打开appsettin ...

  3. EF框架step by step(3)—Code-First

    CodeFirst是EF框架的第三种方式,也是最为复杂一种方式,本文将以EF4.1版本为基础,简要讲解一下用法,同时,也介绍DbContext的用法. 本文采用的示例仍然是前两篇采用的博客用户的示例. ...

  4. MVC+Ef项目(4) 抽象业务逻辑层BLL层

    接下来,我们就要到业务逻辑层了,简单的说,业务逻辑层就是调用Repository(可以看做是DAL数据库访问层) 先来看看项目的架构 我们现在就开始来做BLL层.  同样,先编写  UserInfoS ...

  5. MVC+Ef项目(2) 如何更改项目的生成顺序;数据库访问层Repository仓储层的实现

    我们现在先来看看数据库的生成顺序   居然是 Idal层排在第一,而 web层在第二,model层反而在第三 了   我们需要把 coomon 公用层放在第一,Model层放在第二,接下来是 Idal ...

  6. MVC+Ef项目(1) 项目的框架搭建

    一:首先我们来搭建最基本的项目框架,这里使用MVC3作为web项目,然后我们添加几个类库项目 最后的项目如下, 其中有一个 YouJiao.MvcWeb.Repository 实际就当做是 DAL层即 ...

  7. EF项目中应用出现问题???

    最近用EF做了个项目发现很多不便利的地方. 具体如下. 1,我是通过edmx 建模,然后通过模型生成数据库. 虽然数据库已经创建成功但是问题来了,我在加字段,和标的时候再次生成时domeo.edmx. ...

  8. MyEclipse导入Maven项目以及Maven转化为Dynamic Web Module(转)

    MyEclipse导入Maven项目(这个博主写的比较详细)https://blog.csdn.net/w12345_ww/article/details/52094756 Maven转化为Dynam ...

  9. EF使用MySql DBFirst产品的问题总结

    一.实体数据模型向导->新建连接->更改数据源  找不到MySql Batabase选项. 解决:需求安装以下两个插件(mysql官网都可以找到)(注意版本,后面会讲到) 1.MySql ...

随机推荐

  1. JS中深浅拷贝 函数封装代码

    一.了解 基本数据类型保存在栈内存中,按值访问,引用数据类型保存在堆内存中,按址访问. 二.浅拷贝 浅拷贝只是复制了指向某个对象的指针,而不是复制对象本身,新旧对象其实是同一内存地址的数据,修改其中一 ...

  2. 通过sql的DMV查看数据库使用状态

    --数据库隔离级别 读未提交 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; --查找每次执行时引发I/O最多的前10位的查询 total_logi ...

  3. 在JavaScript文件中用jQuery方法实现日期时间选择功能

    JavaScript Document $(document).ready(function(e) { 在文本框里面显示当前日期 var date = new Date(); var nian = d ...

  4. vue-router 手势滑动触发返回

    vue-router的路由变换只存在“变换前”和“变换后”,不存在“切换中”的状态,所以做不到大多数app(微信那样的)在滑动过程中让界面跟随手指移动.但滑动事件还是可以监听的,我们可以在滑动之后再触 ...

  5. Http 缓存机制

    HTTP 缓存体系 首先我将 Http 缓存体系分为以下三个部分: HTTP/ OK Cache-Control: no-cache Content-Type: image/png Last-Modi ...

  6. 构建第一个SpringBoot工程

    学习和使用 SpringBoot 有一段时间了,现在开始陆陆续续会总结归纳 SpringBoot 学习中遇到的相关知识点. SpringBoot 设计目的是用来简化新Spring应用的初始搭建以及开发 ...

  7. 从零自学Java-5.使用条件测试进行判断

    1.使用if语句进行最基本的条件测试:2.测试一个值大于还是小于另一个值:3.测试两个值是否相等:4.使用与if语句对应的else语句:5.组合多个条件测试:6.使用switch语句进行复杂的条件测试 ...

  8. zabbix agent 3.4 安装指南

    从官方网站www.zabbix.com 下载zabbix agent安装包.目前最新版本是4.0 LTS release. 在需要监控的服务器上安装zabbix agent. 先解压安装包. 配置 c ...

  9. 《SQL Server 2008从入门到精通》--20180723

    目录 1.架构 1.1.创建架构并在架构中创建表 1.2.删除架构 1.3.修改表的架构 2.视图 2.1.新建视图 2.2.使用视图修改数据 2.3.删除视图 3.索引 3.1.聚集索引 3.2.非 ...

  10. 【待补充】[Spark Core] Spark 实现标签生成

    0. 说明 在 IDEA 中编写 Spark 代码实现将 JSON 数据转换成标签,分别用 Scala & Java 两种代码实现. 1. 准备 1.1 pom.xml  <depend ...