实体框架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
看到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。