在数据库优先方法中使用EF6和Effort

Bou*_*bou 3 entity-framework-6 effort

我将Model First方法与EF6结合使用,并且尝试使用Entity Framework Effort开发内存测试。

这是我在测试中要做的事情:

var inMemoryConnection = Effort.DbConnectionFactory.CreateTransient("name=MyEntities");
var inMemoryContext = new MyEntities(inMemoryConnection);
Run Code Online (Sandbox Code Playgroud)

我的实体:

public partial class MyEntities: DbContext
{
    public MyEntities(DbConnection dbConnection)
        : base(dbConnection, contextOwnsConnection: true)
    {
    }
Run Code Online (Sandbox Code Playgroud)

运行测试时,出现错误消息,因为我未使用“代码优先”方法,所以未指定任何正常的[key]属性。因此,调用了OnModelCreating方法,而不必这样做。

有没有一种方法可以在Model First设计中使用工作量而不必添加这些属性?

谢谢 !

Bou*_*bou 6

我发现了我的错误。

事实证明Effort.DbConnectionFactory.CreateTransient用于代码优先。

相反,如果您使用的是.edmx,模型优先,那就是Effort。您必须使用的实体 ConnectionFactory.CreateTransient(“ name = MyEntities”)。

  • @MattKoch 我不得不将 `<provider invariantName="Effort.Provider" type="Effort.Provider.EffortProviderServices,Effort" />` 添加到我的 app.config 的 `<providers>` 部分 (2认同)

Mor*_*ard 6

在尝试让 Effort 首先使用 DB 或模型优先(也称为模型)方法时,我也遇到了一些困难。这是我为使其工作所做的工作:

  • 下载 Effort.EF6 nuget 包
  • 将work.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>
Run Code Online (Sandbox Code Playgroud)
  • 将 sql-provider 替换为连接字符串中的 Effort-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=&quot;data source=testDB;initial catalog=foobaroo;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;"  />
  </connectionStrings>
Run Code Online (Sandbox Code Playgroud)
  • 如果您的模型优先上下文没有提供您可以注入连接的构造函数,您可以修改您的 tt-template 来这样做:
<#=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.
Run Code Online (Sandbox Code Playgroud)
  • 我们现在可以使用该构造函数来实例化一个连接,以及一个基于此连接的基于 Effort 的内存数据库上下文:
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();
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。

PS 其他人不得不在他们的配置中添加一个 db-provider-factory 部分。这对我来说不是必需的,但也许对你来说:

<system.data>
    <DbProviderFactories>
      <add name="Effort.Provider" invariant="Effort.Provider" description="Effort.Provider" type="Effort.Provider.EffortProviderFactory,Effort" />
    </DbProviderFactories>
  </system.data>
Run Code Online (Sandbox Code Playgroud)