我尝试使用CodeFirst和实体框架6,因为我需要它使用MVC 5。
我已经为Visual 2012安装了实体框架6.1.3工具,以便首先从数据库生成代码。我还加入了掘金的MySQL.Data.Entities。
在选择连接后,当我使用向导从数据库生成Codefirst时,我将得到以下错误(从西班牙语翻译)
您的项目引用了EntityFramework的最后一个版本。但无法找到与此版本兼容的实体框架数据库提供程序。如果您已经安装了兼容的提供程序,请确保在执行此操作之前编译项目。在其他情况下,退出向导,在执行此操作之前安装兼容的提供程序并编译项目。
我想首先使用代码,因为我认为这更适合于使用两个不同的提供者(甲骨文和MySQL)。根据场景的不同,该解决方案必须在Oracle和MySQL上运行,方法是更改connectionString。
服务器版本是MySQL 5.6.19和Oracle11g。
发布于 2015-09-08 10:06:07
您需要安装MySql连接器/网。对于甲骨文,您也需要安装使用的.Net数据提供程序(ODAC)。确保您正在使用特定Visual版本的工具下载ODAC。
发布于 2015-09-13 21:23:31
考虑到Visual的向导无法工作,我开始手动执行该过程,并希望展示它以帮助其他处理相同问题的人。
我从nugget中添加了MySQL.Entities.EF6和Oracle.ManagedDataAccess,并且在nugget中使用了update命令。
在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使用数据库优先向导创建的实体,并且我已经复制了所有这些实体来用DataAnnotations修改它们,从而节省了使用它们的属性创建实体。
public partial class T_TABLE
{
[Key]
public int ID { get; set; }
[MaxLength(45)]
public string NAME { get; set; }
}如果你和我有同样的问题,希望这能帮到你。这种方法太手工了,但对我来说效果很好。
https://stackoverflow.com/questions/32453939
复制相似问题