The Issue
For testing purposes, you should be able to delete, recreate, and reseed InMemory databases and the result should be the same for each test. Currently identity columns do not reset, so IDs increment with each test iteration.
Repro Steps
This test fails. It should pass.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Xunit;
namespace EfCoreInMemory
{
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
}
public class AppDbContext : DbContext
{
public DbSet<Item> Items { get; set; }
public AppDbContext(DbContextOptions<AppDbContext> options ):base(options)
{
}
}
public class Tests
{
private static DbContextOptions<AppDbContext> CreateNewContextOptions()
{
// Create a fresh service provider, and therefore a fresh
// InMemory database instance.
var serviceProvider = new ServiceCollection()
.AddEntityFrameworkInMemoryDatabase()
.BuildServiceProvider();
// Create a new options instance telling the context to use an
// InMemory database and the new service provider.
var builder = new DbContextOptionsBuilder<AppDbContext>();
builder.UseInMemoryDatabase()
.UseInternalServiceProvider(serviceProvider);
return builder.Options;
}
[Fact]
public void Test1()
{
// create a brand new dbContext
var dbContext = new AppDbContext(CreateNewContextOptions());
// add one item
var item = new Item();
dbContext.Items.Add(item);
dbContext.SaveChanges();
// ID should be 1
Assert.Equal(1, item.Id);
dbContext.Database.EnsureDeleted();
Assert.False(dbContext.Items.Any());
var item2 = new Item();
dbContext.Items.Add(item2);
dbContext.SaveChanges();
// ID should STILL be 1
Assert.Equal(1, item2.Id);
}
}
}
Further technical details
Project.json:
{
"version": "1.0.0-*",
"testRunner": "xunit",
"dependencies": {
"NETStandard.Library": "1.6.0",
"xunit": "2.2.0-beta2-build3300",
"dotnet-test-xunit": "2.2.0-preview2-build1029",
"Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
"Microsoft.AspNetCore.TestHost": "1.0.0",
"Microsoft.EntityFrameworkCore": "1.0.0",
"Microsoft.EntityFrameworkCore.InMemory": "1.0.0"
},
"frameworks": {
"netcoreapp1.0": {
"imports": [
"dotnet5.6"
],
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0"
}
}
}
}
}
VS2015
The Issue
For testing purposes, you should be able to delete, recreate, and reseed InMemory databases and the result should be the same for each test. Currently identity columns do not reset, so IDs increment with each test iteration.
Repro Steps
This test fails. It should pass.
Further technical details
Project.json:
{ "version": "1.0.0-*", "testRunner": "xunit", "dependencies": { "NETStandard.Library": "1.6.0", "xunit": "2.2.0-beta2-build3300", "dotnet-test-xunit": "2.2.0-preview2-build1029", "Microsoft.AspNetCore.Server.Kestrel": "1.0.0", "Microsoft.AspNetCore.TestHost": "1.0.0", "Microsoft.EntityFrameworkCore": "1.0.0", "Microsoft.EntityFrameworkCore.InMemory": "1.0.0" }, "frameworks": { "netcoreapp1.0": { "imports": [ "dotnet5.6" ], "dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.0.0" } } } } }VS2015