代码之家  ›  专栏  ›  技术社区  ›  Boubou

在DB-First方法中使用EF6的努力

  •  7
  • Boubou  · 技术社区  · 8 年前

    我在EF6中使用模型优先的方法 Entity Framework Effort 开发记忆测试。

    以下是我在测试中所做的:

    var inMemoryConnection = Effort.DbConnectionFactory.CreateTransient("name=MyEntities");
    var inMemoryContext = new MyEntities(inMemoryConnection);
    

    MyEntities公司:

    public partial class MyEntities: DbContext
    {
        public MyEntities(DbConnection dbConnection)
            : base(dbConnection, contextOwnsConnection: true)
        {
        }
    

    当我运行测试时,我得到一个错误,说我没有指定任何正常的[键]属性,因为我没有使用代码优先的方法。因此,将调用OnModelCreating方法,而不必这样做。

    有没有一种方法可以在模型优先设计中使用努力,而不必添加这些属性?

    谢谢

    2 回复  |  直到 8 年前
        1
  •  8
  •   Boubou    8 年前

    我发现了我的错误。

    结果是努力。DbConnectionFactory。CreateTransient首先用于代码。

    相反,如果您正在使用。edmx,模特优先,这是努力。 实体 连接工厂。您必须使用的CreateTransient(“name=MyEntities”)。

        2
  •  7
  •   Morten Nørgaard    7 年前

    我也曾有过一段困难的时期,试图努力先使用DB,或者也被称为“先建模”的方法。我就是这么做的:

    • 下载成果。EF6 nuget包
    • 增加工作量。实体框架配置部分的提供程序:
        <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提供程序:
    <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>
    
    • 如果您的model first上下文没有提供可以向其中注入连接的构造函数,则可以修改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.
    
    • 现在,我们可以使用该构造函数实例化一个连接,以及基于该连接的内存db上下文中的工作:
    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、 其他人不得不在他们的配置中添加db provider factory部分。这对我来说不是必需的,但对你来说可能是:

    <system.data>
        <DbProviderFactories>
          <add name="Effort.Provider" invariant="Effort.Provider" description="Effort.Provider" type="Effort.Provider.EffortProviderFactory,Effort" />
        </DbProviderFactories>
      </system.data>