实体框架6 CodeFirst与Oracle和MySql

本文关键字:Oracle MySql CodeFirst 框架 实体 | 更新日期: 2023-09-27 18:11:52

我正在尝试使用CodeFirst和实体框架6,因为我需要它使用MVC 5。我有MySQL和Oracle上现有的数据库模式,两者都具有相同的模式(相同的表,字段,限制…)

我已经为Visual Studio 2012安装了实体框架6.1.3工具,以便首先从数据库生成代码。我还从nuget中添加了MySQL.Data.Entities。

当我使用向导在选择连接后从数据库生成Codefirst时,我得到以下错误(从西班牙语翻译)

你的项目引用了EntityFramework的最新版本。但实体框架数据库提供程序与此版本兼容找不到。如果您已经安装了兼容的提供程序在执行此操作之前,请确保编译项目。在其他情况下退出向导,安装兼容的提供程序并编译

我想先用代码做,因为我认为这对两个不同的提供者(Oracle和MySQL)工作更好。解决方案必须在Oracle和MySQL上运行,这取决于通过改变connectionString的场景。

Server版本为MySQL 5.6.19和Oracle 11g

实体框架6 CodeFirst与Oracle和MySql

看到Visual Studio的向导不工作,我开始手动执行这个过程,我想展示它来帮助其他人解决同样的问题。

我添加了MySQL.Entities。EF6和Oracle。ManagedDataAccess从nuget和他们我已经使用了nuget中的update-package命令。

在App.config我必须添加DBProvider工厂。

<DbProviderFactories>
  <remove invariant="MySql.Data.MySqlClient" />
  <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.7.0, Culture=neutral, PublicKeyToken=***" />
  <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=***" />
</DbProviderFactories>

在App.config的Entityframework部分,你必须添加提供商。

<providers>
  <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
  <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework" />
</providers>

当然你也需要删除你的数据库的连接字符串。

你必须像这样实现你的上下文。对于Oracle,你必须指定Schema Name。对我来说,没有它就无法工作。在上下文中,您必须为每个实体添加一个DBSet属性。

namespace EFCodeFirst.DataModel
{
    public partial class Entities : DbContext
    {
        //EntitiesOracle -> Name of the connection String
        public Entities()
            : base("name=EntitiesOracle")
        {
        }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //For Oracle is neccesary
            modelBuilder.HasDefaultSchema("SCHEMA_NAME");
        }
        public DbSet<T_TABLE> T_TABLE { get; set; }
    }
}

你要做的最后一件事是创建实体T_TABLE。你可以用数据注解修饰实体的属性。在我的情况下,我决定使用Visual Studio使用Database First向导创建的实体,我已经复制了所有的实体,用DataAnnotations修改它们,为我节省了创建实体的时间。

public partial class T_TABLE
{    
    [Key]
    public int ID { get; set; }
    [MaxLength(45)]
    public string NAME { get; set; }
}

希望这能帮助你,如果你有同样的问题,我。这种方式太手动,但它对我来说工作得很好。

您需要安装MySql Connector/Net。Oracle也是一样,你需要安装Oracle Data Provider for . net (ODAC)和Oracle Developer Tools for Visual Studio。确保您正在下载针对特定Visual Studio版本的带有工具的ODAC。