Я использую подход Model First с 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)
{
}
Когда я запускаю тесты, я получаю сообщение о том, что я не указывал никаких [ключевых] атрибутов, что является нормальным, так как я не использую подход Code First. Поэтому метод OnModelCreating вызывается и не должен.
Есть ли способ использовать Effort в модели First Design без необходимости добавлять эти атрибуты?
Благодаря !
Я нашел свою ошибку.
Выключает Effort.DbConnectionFactory.CreateTransient используется для Code-First.
Вместо этого, если вы работаете с .edmx, Model-First, это Effort. Entity ConnectionFactory.CreateTransient («name = MyEntities»), который вы должны использовать.
У меня тоже было немного трудное время, когда я пытался заставить Effort сначала работать с БД или сначала с моделью, как это также известно, подход. Вот что я сделал, чтобы это заработало:
<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();
Надеюсь это поможет.
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>