在 DB First 方法中将 Effort 与 EF6 结合使用
Using Effort with EF6 in a DB First approach
我在 EF6 中使用模型优先方法,我正在尝试使用 Entity Framework Effort 开发内存中测试。
这是我在测试中所做的:
var inMemoryConnection = Effort.DbConnectionFactory.CreateTransient("name=MyEntities");
var inMemoryContext = new MyEntities(inMemoryConnection);
我的实体:
public partial class MyEntities: DbContext
{
public MyEntities(DbConnection dbConnection)
: base(dbConnection, contextOwnsConnection: true)
{
}
当我 运行 测试时,我收到一条错误消息,提示我没有指定任何 [key] 属性,这是正常的,因为我没有使用 Code First 方法。因此,不必调用 OnModelCreating 方法。
有没有一种方法可以在模型优先设计中使用 Effort 而无需添加这些属性?
谢谢!
我发现了我的错误。
原来 Effort.DbConnectionFactory.CreateTransient 用于代码优先。
相反,如果您使用的是 .edmx,Model-First,它是 Effort。EntityConnectionFactory.CreateTransient("name=MyEntities") 您必须使用。
我也遇到了一些困难,试图让 Effort 首先使用数据库,或者首先使用模型,这也是众所周知的方法。这就是我为让它发挥作用所做的工作:
- 下载 Effort.EF6 nuget 包
- 将 effort.provider 添加到实体框架配置部分:
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="Effort.Provider" type="Effort.Provider.EffortProviderServices,Effort" />
</providers>
</entityFramework>
- 用连接字符串中的 Effort-provider 替换 sql-provider:
<connectionStrings>
<add name="testDb" providerName="Effort.Provider" connectionString="metadata=res://*/StaginDB.csdl|res://*/StaginDB.ssdl|res://*/StaginDB.msl;provider=System.Data.SqlClient;provider connection string="data source=testDB;initial catalog=foobaroo;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" />
</connectionStrings>
- 如果您的模型优先上下文不提供可以注入连接的构造函数,您可以修改您的 tt 模板来执行此操作:
<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext
{
// I added this constructor so I could inject a db-connection into the context:
public <#=code.Escape(container)#>(System.Data.Common.DbConnection dbConnection, bool contextOwnsConnection)
: base(dbConnection, contextOwnsConnection)
{
}
// Original constructor
public <#=code.Escape(container)#>()
: base("name=<#=container.Name#>")
{
<#
if (!loader.IsLazyLoadingEnabled(container))
{
#>
this.Configuration.LazyLoa.... etc. etc.
- 我们现在可以使用该构造函数来实例化连接,以及基于此连接的基于工作量的内存数据库上下文:
System.Data.Common.DbConnection connection = Effort.EntityConnectionFactory.CreateTransient("name=KPDBSTAGINGEntities");
TestDbContext testDbContext = new testDbContext(connection, false);
TestDbContext.your-entity.add( new your-entity() { etc. tec. });
TestDbContext.SaveChanges();
希望这对您有所帮助。
P.S。其他人不得不在他们的配置中添加一个 db-provider-factory 部分。这对我来说不是必需的,但也许对你来说:
<system.data>
<DbProviderFactories>
<add name="Effort.Provider" invariant="Effort.Provider" description="Effort.Provider" type="Effort.Provider.EffortProviderFactory,Effort" />
</DbProviderFactories>
</system.data>
我在 EF6 中使用模型优先方法,我正在尝试使用 Entity Framework Effort 开发内存中测试。
这是我在测试中所做的:
var inMemoryConnection = Effort.DbConnectionFactory.CreateTransient("name=MyEntities");
var inMemoryContext = new MyEntities(inMemoryConnection);
我的实体:
public partial class MyEntities: DbContext
{
public MyEntities(DbConnection dbConnection)
: base(dbConnection, contextOwnsConnection: true)
{
}
当我 运行 测试时,我收到一条错误消息,提示我没有指定任何 [key] 属性,这是正常的,因为我没有使用 Code First 方法。因此,不必调用 OnModelCreating 方法。
有没有一种方法可以在模型优先设计中使用 Effort 而无需添加这些属性?
谢谢!
我发现了我的错误。
原来 Effort.DbConnectionFactory.CreateTransient 用于代码优先。
相反,如果您使用的是 .edmx,Model-First,它是 Effort。EntityConnectionFactory.CreateTransient("name=MyEntities") 您必须使用。
我也遇到了一些困难,试图让 Effort 首先使用数据库,或者首先使用模型,这也是众所周知的方法。这就是我为让它发挥作用所做的工作:
- 下载 Effort.EF6 nuget 包
- 将 effort.provider 添加到实体框架配置部分:
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="Effort.Provider" type="Effort.Provider.EffortProviderServices,Effort" />
</providers>
</entityFramework>
- 用连接字符串中的 Effort-provider 替换 sql-provider:
<connectionStrings>
<add name="testDb" providerName="Effort.Provider" connectionString="metadata=res://*/StaginDB.csdl|res://*/StaginDB.ssdl|res://*/StaginDB.msl;provider=System.Data.SqlClient;provider connection string="data source=testDB;initial catalog=foobaroo;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" />
</connectionStrings>
- 如果您的模型优先上下文不提供可以注入连接的构造函数,您可以修改您的 tt 模板来执行此操作:
<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext
{
// I added this constructor so I could inject a db-connection into the context:
public <#=code.Escape(container)#>(System.Data.Common.DbConnection dbConnection, bool contextOwnsConnection)
: base(dbConnection, contextOwnsConnection)
{
}
// Original constructor
public <#=code.Escape(container)#>()
: base("name=<#=container.Name#>")
{
<#
if (!loader.IsLazyLoadingEnabled(container))
{
#>
this.Configuration.LazyLoa.... etc. etc.
- 我们现在可以使用该构造函数来实例化连接,以及基于此连接的基于工作量的内存数据库上下文:
System.Data.Common.DbConnection connection = Effort.EntityConnectionFactory.CreateTransient("name=KPDBSTAGINGEntities");
TestDbContext testDbContext = new testDbContext(connection, false);
TestDbContext.your-entity.add( new your-entity() { etc. tec. });
TestDbContext.SaveChanges();
希望这对您有所帮助。
P.S。其他人不得不在他们的配置中添加一个 db-provider-factory 部分。这对我来说不是必需的,但也许对你来说:
<system.data>
<DbProviderFactories>
<add name="Effort.Provider" invariant="Effort.Provider" description="Effort.Provider" type="Effort.Provider.EffortProviderFactory,Effort" />
</DbProviderFactories>
</system.data>