A while ago, I wrote an article which talked about how to test repository classes using Entity Framework and not using Entity Framework.
It has been a while and I am just about to start a small project for one of the Admin staff at work, to aid her in her day to day activities.
As always, there will be a database involved.
I will likely be using Owin and OR MVC5 with Aurelia.IO
for Client side.
Not sure about DB, so I decided to try out the In Memory support in the yet to be released Entity Framework 7.
Grabbing the Nuget Package
So let's have a look. The first thing you will need to do is grab the Nuget package which for me was as easy as using the Nuget package window in Visual Studio 2015.
The package name is “EntityFramework.InMemory
” this will bring in the other bits and pieces you need.
NOTE: This is a pre-release NuGet package so you will need to include prelease packages.
The Model
So now that I have the correct packages in place, it's just a question of crafting some model classes. I am using the following 2.
Person
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EF7_InMemoryProviderTest
{
public class Person
{
public Person()
{
Qualifications = new List<Qualification>();
}
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public ICollection<Qualification> Qualifications { get; set; }
public override string ToString()
{
string qualifications = Qualifications.Any() ?
Qualifications.Select(x => x.Description)
.Aggregate((x, y) => string.Format("{0} {1}", x, y)) :
string.Empty;
return string.Format("Id : {0}, FirstName : {1},
LastName : {2}, \r\nQualifications : {3}\r\n",
Id, FirstName, LastName, qualifications);
}
}
}
Qualification
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EF7_InMemoryProviderTest
{
public class Qualification
{
public int Id { get; set; }
public string Description { get; set; }
public override string ToString()
{
return string.Format("Id : {0}, Description : {1}",
Id, Description);
}
}
}
Custom DbContext
Nothing more to it than that. So now let's look at creating a DbContext
which has our stuff in it. For me, this again is very simple, I just do this:
using Microsoft.Data.Entity;
using Microsoft.Data.Entity.Infrastructure;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EF7_InMemoryProviderTest
{
public class ClassDbContext : DbContext
{
public ClassDbContext(DbContextOptions options)
: base(options)
{
}
public DbSet<Person> Members { get; set; }
public DbSet<Qualification> Qualifications { get; set; }
}
}
Writing Some Test Code Using The InMemory Provider
So now that we have all the pieces in place, let's run some code to do a few things
- Seed some data
- Obtain a
Person
- Add a
Qualification
to the Person
obtained
Here is all the code to do this:
using Microsoft.Data.Entity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EF7_InMemoryProviderTest
{
class Program
{
static void Main(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<ClassDbContext>();
optionsBuilder.UseInMemoryDatabase();
using (var classDbContext = new ClassDbContext(optionsBuilder.Options))
{
SeedData(classDbContext);
var personId1 = GetMember(classDbContext, 1);
Console.WriteLine("> Adding a qualication\r\n");
personId1.Qualifications.Add(classDbContext.Qualifications.First());
classDbContext.SaveChanges();
personId1 = GetMember(classDbContext, 1);
Console.ReadLine();
}
}
private static Person GetMember(ClassDbContext classDbContext, int id)
{
var person = classDbContext.Members.FirstOrDefault(x => x.Id == id);
Console.WriteLine(person);
return person;
}
private static void SeedData(ClassDbContext classDbContext)
{
classDbContext.Members.Add(new Person()
{
Id = 1,
FirstName = "Sacha",
LastName = "Barber"
});
classDbContext.Members.Add(new Person()
{
Id = 2,
FirstName = "Sarah",
LastName = "Barber"
});
classDbContext.Qualifications.Add(new Qualification()
{
Id = 1,
Description = "Bsc Hons : Computer Science"
});
classDbContext.Qualifications.Add(new Qualification()
{
Id = 2,
Description = "Msc : Computer Science"
});
classDbContext.Qualifications.Add(new Qualification()
{
Id = 3,
Description = "Bsc Hons : Naturapathic medicine"
});
classDbContext.SaveChanges();
}
}
}
And this is the result:
Closing Note
Quite happy with how easy this was, and I think I would definitely try this out for real.
If you want to play along, I have a demo project (for Visual Studio 2015) at https://github.com/sachabarber/EF7_InMemoryTest.