J'utilise l'approche Model First avec EF6 et j'essaie d'utiliser Entity Framework Effort pour développer des tests en mémoire.
Voici ce que je fais dans mon test:
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)
{
}
Lorsque je lance les tests, un message d'erreur m'indique que je n'ai spécifié aucun attribut [clé], ce qui est normal car je n'utilise pas l'approche Code First. Par conséquent, la méthode OnModelCreating est appelée et ne devrait pas être obligée.
Existe-t-il un moyen d'utiliser Effort dans une conception Model First sans avoir à ajouter ces attributs?
Merci !
J'ai trouvé mon erreur.
Effort.DbConnectionFactory.CreateTransient est utilisé pour Code-First.
Si vous travaillez avec un modèle .edmx, Model-First, c'est plutôt un effort. Entity ConnectionFactory.CreateTransient ("name = MyEntities"), vous devez utiliser.
Moi aussi, j'ai eu un peu de mal à essayer de faire en sorte qu'Effort travaille d'abord avec une base de données ou un modèle, comme on l'appelle également. Voici ce que j'ai fait pour que ça marche:
<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>
<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>
<#=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();
J'espère que cela t'aides.
PS D'autres ont dû ajouter une section db-provider-factory à leur configuration. Ce n'était pas nécessaire pour moi, mais peut-être pour vous:
<system.data>
<DbProviderFactories>
<add name="Effort.Provider" invariant="Effort.Provider" description="Effort.Provider" type="Effort.Provider.EffortProviderFactory,Effort" />
</DbProviderFactories>
</system.data>