I want to enable unit testing of my DbContext
based on entity framework 6. I have created my DbContext
and my models with the database first approach and now have an .edmx designer file.
My automatically created DbContext
does override the DbContext.OnModelCreating
method like this:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
I am trying to create a new instance of my DbContext
in my mocked data access service based on the information of this article. My code doesn't run into Database.SetInitializer;
like the author of this blog post pointed out. My constructor looks exactly like his. My DbContext
initialization looks like this:
public DatabaseEntities(DbConnection connection)
: base(connection, true) { }
Which results in following exception when reaching the previously mentioned overridden OnModelCreating
System.Data.Entity.Infrastructure.UnintentionalCodeFirstException: 'The context is being used in Code First mode with code that was generated from an EDMX file for either Database First or Model First development. This will not work correctly. To fix this problem do not remove the line of code that throws this exception. If you wish to use Database First or Model First, then make sure that the Entity Framework connection string is included in the app.config or web.config of the start-up project. If you are creating your own DbConnection, then make sure that it is an EntityConnection and not some other type of DbConnection, and that you pass it to one of the base DbContext constructors that take a DbConnection. To learn more about Code First, Database First, and Model First see the Entity Framework documentation here: http://go.microsoft.com/fwlink/?LinkId=394715'
There are plenty of questions on stackoverflow which focus on unit testing with effort while using the database-first apporach, but no one seems to have similar problems like me.
OnModelCreating()
.DbContext
with Moq, which is definitely not an option.How can i create and use an in-memory database (with effort)?
Additional information
When I uncomment the OnModelCreating()
, an exception will be thrown at the first access to the DataContext. E.g.:
DbConnection effortConnection = Effort.DbConnectionFactory.CreatePersistent("MockedDatabaseEntities");
using (DatabaseEntities dataContext = new DatabaseEntities(effortConnection))
{
dataContext.Students.Count(); // Exception throws here
}
System.Data.Entity.ModelConfiguration.ModelValidationException: 'One or more validation errors were detected during model generation: MyApplication.Shared.Model.KeyValuePair: : EntityType 'KeyValuePair' has no key defined. Define the key for this EntityType. KeyValuePairs: EntityType: EntitySet 'KeyValuePairs' is based on type 'KeyValuePair' that has no keys defined.'
The problem was that I had to specify the key for my KeyValuePair dataset.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<KeyValuePair>().HasKey(x => x.Key);
base.OnModelCreating(modelBuilder, null);
}
Thank you very much Robert Jørgensgaard Engdahl !