繁体   English   中英

带有Oracle和MySql的实体框架6 CodeFirst

[英]Entity Framework 6 CodeFirst with Oracle and MySql

我正在尝试使用CodeFirst和Entity Framework 6,因为我需要使用它来使用MVC5。我在MySQL和Oracle上都有现有的数据库架构,它们都具有相同的架构(相同的表,字段,限制...)

我已经安装了用于Visual Studio 2012的Entity Framework 6.1.3工具,以从数据库生成代码优先。 而且我还从Nugget添加了MySQL.Data.Entities。

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

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

我想先使用代码,因为我认为这对于与两个不同的提供程序(Oracle和MySQL)一起使用会更好。 通过更改connectionString,该解决方案必须根据情况在Oracle和MySQL上运行。

服务器版本为MySQL 5.6.19和Oracle 11g。

您需要安装MySql Connector / Net 对于Oracle同样,您需要使用Oracle Visual Studio的Oracle开发工具安装Oracle .NET(ODAC)数据提供程序 确保为特定的Visual Studio版本下载带有工具的ODAC。

鉴于Visual Studio的向导无法正常工作,我想手动执行该过程,并希望向其他人展示它以帮助遇到相同问题的人。

我从nugget中添加了MySQL.Entities.EF6和Oracle.ManagedDataAccess,他们在nugget中使用了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,您必须指定架构名称。 对我来说,没有它是行不通的。 在上下文中,您必须为每个实体添加一个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。 您可以使用DataAnnotations装饰实体的属性。 在我的情况下,我决定使用通过Visual Studio使用“数据库优先”向导创建的实体,并复制了所有实体以使用DataAnnotations对其进行修改,从而节省了使用其属性创建实体的时间。

public partial class T_TABLE
{    
    [Key]
    public int ID { get; set; }

    [MaxLength(45)]
    public string NAME { get; set; }
}

如果您遇到与我相同的问题,希望对您有帮助。 这种方法太过手动,但对我来说效果很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM