问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ef code first db first 哪种好

发布网友 发布时间:2022-04-09 21:09

我来回答

2个回答

懂视网 时间:2022-04-10 01:30

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; }
 }
}
View Code

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; }
 }
}
View Code

 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>
View Code

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

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

标签:文件夹   mil   core   写入   database   用户名   oca   官方   one   

热心网友 时间:2022-04-09 22:38

EF的CodeFirst是个好东西,让我们完全不用考虑数据库端(注意,这里并不是说不需要对数据库知识进行了解),一切工作都可以通过代码来完成。EF是ORM,已经把数据访问操作封装得很好了,可以直接在业务层中使用,那我们为什么还要对其进行那么多封装呢?在我看来,封装至少能带来如下的好处:
把EF的相关对象封装在数据访问层中,解除了业务层对EF的依赖。
统一EF的数据操作,以保证业务层使用相同的代码规范
隐藏EF的敏感配置,降低EF的使用难度
这里就引入一个问题,应该怎样来进行EF的封装呢,既要保证使用的统一与方便性,又要保持EF的灵便性,否则,封装将变成给业务层设置障碍。下面,主要针对数据查询进对可能出现的误用情况进行分析。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...和O3、1H216O和2H218O.下列有关说法正确的是( )A.35Cl和37Cl互称为... ...做环境分析指示物.下列说法中正确的是( )A.1H216O在相同 ...1H、2H、3H,氧也有3钟同位素:16O、17O、18O,那么水的种类最多有... 全身没力气、想睡觉怎么回事 我的乙肝检查单 请帮忙看看 帮忙看看乙肝检查报告 谢谢 万分感谢!好人一生平安 麻烦帮我看看乙肝两对半的结果 五冶集团由哪家控股 我的苹果6手机百度视频播放不了是什么原因? 高一怎么选科历生地 医保有哪些好处? 导数相乘运算巾中导不导不导导是什么意思?学霸大神帮帮我吧&#x0669;(&#x0E51;ò... n个导数相乘,导数的运算法则是什么样的 两数相乘的导数等于什么 两个函数相乘求导 三个括号求导 三个函数相乘求导咋求 多个函数的乘法求导法则 2ex求导是什么啊?三个数相乘的求导是怎么求啊 好几个式子相乘,求导。怎么求 三个数相乘怎么求导例如2ex怎么求导 高中数学:三个因式相乘,对它们进行求导,该怎样求??? 请问三个函数相乘的导数该怎么求 三个数乘积的导数怎么求 三个函数相乘,它们的导数怎么算 三项乘积的导数怎么求? 三个数相乘怎么求导 三个数相乘怎么求导 例如2ex 怎么求导?具体步骤是什么啊 昨天晚上梦见一只花老虎追着我和我老公两个人跑,这是什么意思啊? 做梦梦到了老虎追我呢,什么意思 高中中途退学可以读大专吗 如何将原绑定现在的手机号? 1.8升 等于多少斤 高中中途辍学,没能领到高中毕业证,让学校证明能参加高考吗?能上个大专吗 1.8升是几斤 饭盒1.8l等于多少斤 一个高中辍学的人可以直接读大专吗? 1.8l是多少斤? 高中辍学能上大专吗? 1.8升清酒等于多少斤 高中读到一半如果辍学,能读大专吗? 我高二辍学没有毕业证没有高考可以上大专吗? 1.8升的瓶子可以装多少斤水 高中没有毕业,辍学了,可以读大专么 培训班交费没签合同能退费吗 1.8升水多少克 高中没有读完可以读大专吗? 高二的时候辍学了,没有毕业证,现在想上大专可以上么 1.8升水等于多少克 艺术培训机构可以退费吗?