首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有Oracle和MySql的实体框架6

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

Stack Overflow用户
提问于 2015-09-08 09:22:24
回答 2查看 2K关注 0票数 0

我尝试使用CodeFirst和实体框架6,因为我需要它使用MVC 5。

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

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

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

我想首先使用代码,因为我认为这更适合于使用两个不同的提供者(甲骨文和MySQL)。根据场景的不同,该解决方案必须在Oracle和MySQL上运行,方法是更改connectionString。

服务器版本是MySQL 5.6.19和Oracle11g。

EN

回答 2

Stack Overflow用户

发布于 2015-09-08 10:06:07

您需要安装MySql连接器/网。对于甲骨文,您也需要安装使用的.Net数据提供程序(ODAC)。确保您正在使用特定Visual版本的工具下载ODAC。

票数 0
EN

Stack Overflow用户

发布于 2015-09-13 21:23:31

考虑到Visual的向导无法工作,我开始手动执行该过程,并希望展示它以帮助其他处理相同问题的人。

我从nugget中添加了MySQL.Entities.EF6和Oracle.ManagedDataAccess,并且在nugget中使用了update命令。

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

代码语言:javascript
复制
<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部分,您还必须添加提供程序。

代码语言:javascript
复制
<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属性。

代码语言:javascript
复制
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使用数据库优先向导创建的实体,并且我已经复制了所有这些实体来用DataAnnotations修改它们,从而节省了使用它们的属性创建实体。

代码语言:javascript
复制
public partial class T_TABLE
{    
    [Key]
    public int ID { get; set; }

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

如果你和我有同样的问题,希望这能帮到你。这种方法太手工了,但对我来说效果很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32453939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档