发布网友 发布时间: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。如下
将EF项目从dbfirst转化为codefirst
标签:文件夹 mil core 写入 database 用户名 oca 官方 one
热心网友 时间:2022-04-09 22:38
EF的CodeFirst是个好东西,让我们完全不用考虑数据库端(注意,这里并不是说不需要对数据库知识进行了解),一切工作都可以通过代码来完成。EF是ORM,已经把数据访问操作封装得很好了,可以直接在业务层中使用,那我们为什么还要对其进行那么多封装呢?在我看来,封装至少能带来如下的好处: