使用EF6的DB First方法中的Effort

10

我正在使用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 方法,不需要添加这些属性。
是否有一种方法可以在 Model First 设计中使用 Effort,而不必添加这些属性呢?
谢谢!
2个回答

10

我发现了我的错误。

原来 Effort.DbConnectionFactory.CreateTransient 用于 Code-First。

相反地,如果你正在使用 .edmx,Model-First,则需要使用 Effort.EntityConnectionFactory.CreateTransient("name=MyEntities")。


这对我没有用 - 它仍然使用实际的数据库而不是内存中的数据库。你的“app.config”长什么样? - Matt Koch
2
@MattKoch 我不得不在我的 app.config 文件的 <providers> 部分中添加 <provider invariantName="Effort.Provider" type="Effort.Provider.EffortProviderServices,Effort" /> - MikeS
@MattKoch 你怎么知道它正在使用实际的数据库? - Andes Lam
如果出现异常,返回已翻译的文本:参数 'xmlReader' 无效。必须提供至少一个 .ssdl 工件... 同样重要的是,在上述调用“Effort.EntityConnectionFactory.CreateTransient("name=MyEntities")”之前,您需要加载模型程序集(包含 edmx 文件)。即在调用前执行 typeof(MyDbContext) 将解决问题。 - user3391859

9

我也曾经遇到过一些困难,试图使用Effort.EF6进行DB first或model first的开发方式。以下是我的解决方法:

  • 下载Effort.EF6的nuget包
  • 在entity-framework配置文件中添加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>
  • 将连接字符串中的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>
  • 如果您的模型-优先上下文没有提供可注入连接的构造函数,您可以修改您的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.

我们现在可以使用该构造函数来实例化一个连接,以及基于该连接的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();

希望这能帮到你。
顺便提一下,其他人需要在配置文件中添加一个db-provider-factory部分。对我来说不需要,但也许对你有用。
<system.data>
    <DbProviderFactories>
      <add name="Effort.Provider" invariant="Effort.Provider" description="Effort.Provider" type="Effort.Provider.EffortProviderFactory,Effort" />
    </DbProviderFactories>
  </system.data>

在设置连接字符串后,我遇到了一个错误。这个评论解决了我的问题 https://stackoverflow.com/a/77005361/6735035 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接