public async Task Can_use_sequential_GUID_end_to_end_async() { var serviceProvider = new ServiceCollection() .AddEntityFramework() .AddSqlServer() .ServiceCollection .BuildServiceProvider(); using (var context = new BronieContext(serviceProvider, "GooieBronies")) { context.Database.EnsureDeleted(); context.Database.EnsureCreated(); for (var i = 0; i < 50; i++) { await context.AddAsync(new Pegasus { Name = "Rainbow Dash " + i }); } await context.SaveChangesAsync(); } using (var context = new BronieContext(serviceProvider, "GooieBronies")) { // TODO: Currently test passes because SQL Server happens to return values in // inserted order. When OrderBy is done on server it should be added to the query. //var pegasuses = await context.Pegasuses.OrderBy(e => e.Id).ToListAsync(); var pegasuses = await context.Pegasuses.ToListAsync(); for (var i = 0; i < 50; i++) { Assert.Equal("Rainbow Dash " + i, pegasuses[i].Name); } } }
public async Task Can_use_sequence_end_to_end_async() { var serviceProvider = new ServiceCollection() .AddEntityFrameworkSqlServer() .BuildServiceProvider(); using (var context = new BronieContext(serviceProvider, "BroniesAsync")) { context.Database.EnsureDeleted(); context.Database.EnsureCreated(); } await AddEntitiesAsync(serviceProvider, "BroniesAsync"); await AddEntitiesAsync(serviceProvider, "BroniesAsync"); // Use a different service provider so a different generator is used but with // the same server sequence. serviceProvider = new ServiceCollection() .AddEntityFrameworkSqlServer() .BuildServiceProvider(); await AddEntitiesAsync(serviceProvider, "BroniesAsync"); using (var context = new BronieContext(serviceProvider, "BroniesAsync")) { var pegasuses = await context.Pegasuses.ToListAsync(); for (var i = 0; i < 10; i++) { Assert.Equal(3, pegasuses.Count(p => p.Name == "Rainbow Dash " + i)); Assert.Equal(3, pegasuses.Count(p => p.Name == "Fluttershy " + i)); } } }
public async Task Can_use_sequence_end_to_end_from_multiple_contexts_concurrently_async() { var serviceProvider = new ServiceCollection() .AddEntityFrameworkInMemoryDatabase() .BuildServiceProvider(); const int threadCount = 50; var tests = new Func <Task> [threadCount]; for (var i = 0; i < threadCount; i++) { var closureProvider = serviceProvider; tests[i] = () => AddEntitiesAsync(closureProvider); } var tasks = tests.Select(Task.Run).ToArray(); foreach (var t in tasks) { await t; } using (var context = new BronieContext(serviceProvider)) { var pegasuses = await context.Pegasuses.ToListAsync(); for (var i = 0; i < 50; i++) { Assert.True(pegasuses.All(p => p.Id > 0)); Assert.Equal(threadCount, pegasuses.Count(p => p.Name == "Rainbow Dash " + i)); Assert.Equal(threadCount, pegasuses.Count(p => p.Name == "Fluttershy " + i)); } } }
public async Task Can_use_GUIDs_end_to_end_async() { var serviceProvider = new ServiceCollection() .AddEntityFrameworkInMemoryDatabase() .BuildServiceProvider(); var guids = new List <Guid>(); var guidsHash = new HashSet <Guid>(); using (var context = new BronieContext(serviceProvider)) { for (var i = 0; i < 10; i++) { guids.Add(context.Add(new Pegasus { Name = "Rainbow Dash " + i }).Entity.Id); guidsHash.Add(guids.Last()); } await context.SaveChangesAsync(); } Assert.Equal(10, guidsHash.Count); using (var context = new BronieContext(serviceProvider)) { var pegasuses = await context.Pegasuses.OrderBy(e => e.Name).ToListAsync(); for (var i = 0; i < 10; i++) { Assert.Equal(guids[i], pegasuses[i].Id); } } }
public void Can_use_sequence_end_to_end() { var serviceProvider = new ServiceCollection() .AddEntityFrameworkNpgsql() .BuildServiceProvider(); using (var context = new BronieContext(serviceProvider, TestStore.Name)) { context.Database.EnsureCreatedResiliently(); } AddEntities(serviceProvider, TestStore.Name); AddEntities(serviceProvider, TestStore.Name); // Use a different service provider so a different generator is used but with // the same server sequence. serviceProvider = new ServiceCollection() .AddEntityFrameworkNpgsql() .BuildServiceProvider(); AddEntities(serviceProvider, TestStore.Name); using (var context = new BronieContext(serviceProvider, TestStore.Name)) { var pegasuses = context.Pegasuses.ToList(); for (var i = 0; i < 10; i++) { Assert.Equal(3, pegasuses.Count(p => p.Name == "Rainbow Dash " + i)); Assert.Equal(3, pegasuses.Count(p => p.Name == "Fluttershy " + i)); } } }
public async Task Can_use_explicit_values() { var serviceProvider = new ServiceCollection() .AddEntityFrameworkSqlServer() .BuildServiceProvider(); var guids = new List <Guid>(); using (var context = new BronieContext(serviceProvider, TestStore.Name)) { context.Database.EnsureCreated(); for (var i = 0; i < 50; i++) { guids.Add(context.Add(new Pegasus { Name = "Rainbow Dash " + i, Index = i, Id = Guid.NewGuid() }).Entity.Id); } await context.SaveChangesAsync(); } using (var context = new BronieContext(serviceProvider, TestStore.Name)) { var pegasuses = await context.Pegasuses.OrderBy(e => e.Index).ToListAsync(); for (var i = 0; i < 50; i++) { Assert.Equal("Rainbow Dash " + i, pegasuses[i].Name); Assert.Equal(guids[i], pegasuses[i].Id); } } }
private static void AddEntitiesToMultipleContexts( IServiceProvider serviceProvider, string dbName1, string dbName2) { using var context1 = new BronieContext(serviceProvider, dbName1); using var context2 = new BronieContext(serviceProvider, dbName2); for (var i = 0; i < 29; i++) { context1.Add( new Pegasus { Name = "Rainbow Dash " + i }); context2.Add( new Pegasus { Name = "Fluttershy " + i }); context1.Add( new Pegasus { Name = "Fluttershy " + i }); } context1.SaveChanges(); context2.SaveChanges(); }
public async Task Can_use_GUIDs_end_to_end_async() { var serviceProvider = new ServiceCollection() .AddEntityFrameworkInMemoryDatabase() .BuildServiceProvider(); var guids = new List<Guid>(); var guidsHash = new HashSet<Guid>(); using (var context = new BronieContext(serviceProvider)) { for (var i = 0; i < 10; i++) { guids.Add(context.Add(new Pegasus { Name = "Rainbow Dash " + i }).Entity.Id); guidsHash.Add(guids.Last()); } await context.SaveChangesAsync(); } Assert.Equal(10, guidsHash.Count); using (var context = new BronieContext(serviceProvider)) { var pegasuses = await context.Pegasuses.OrderBy(e => e.Name).ToListAsync(); for (var i = 0; i < 10; i++) { Assert.Equal(guids[i], pegasuses[i].Id); } } }
public async Task Only_one_part_of_a_composite_key_needs_to_vary_for_uniquness() { var serviceProvider = new ServiceCollection() .AddEntityFrameworkInMemoryDatabase() .BuildServiceProvider(); var ids = new int[3]; using (var context = new BronieContext(serviceProvider)) { var pony1 = context.Add(new EarthPony { Id2 = 7, Name = "Apple Jack 1" }).Entity; var pony2 = context.Add(new EarthPony { Id2 = 7, Name = "Apple Jack 2" }).Entity; var pony3 = context.Add(new EarthPony { Id2 = 7, Name = "Apple Jack 3" }).Entity; await context.SaveChangesAsync(); ids[0] = pony1.Id1; ids[1] = pony2.Id1; ids[2] = pony3.Id1; } using (var context = new BronieContext(serviceProvider)) { var ponies = context.EarthPonies.ToList(); Assert.Equal(ponies.Count, ponies.Count(e => e.Name == "Apple Jack 1") * 3); Assert.Equal("Apple Jack 1", ponies.Single(e => e.Id1 == ids[0]).Name); Assert.Equal("Apple Jack 2", ponies.Single(e => e.Id1 == ids[1]).Name); Assert.Equal("Apple Jack 3", ponies.Single(e => e.Id1 == ids[2]).Name); ponies.Single(e => e.Id1 == ids[1]).Name = "Pinky Pie 2"; await context.SaveChangesAsync(); } using (var context = new BronieContext(serviceProvider)) { var ponies = context.EarthPonies.ToArray(); Assert.Equal(ponies.Length, ponies.Count(e => e.Name == "Apple Jack 1") * 3); Assert.Equal("Apple Jack 1", ponies.Single(e => e.Id1 == ids[0]).Name); Assert.Equal("Pinky Pie 2", ponies.Single(e => e.Id1 == ids[1]).Name); Assert.Equal("Apple Jack 3", ponies.Single(e => e.Id1 == ids[2]).Name); context.EarthPonies.RemoveRange(ponies); await context.SaveChangesAsync(); } using (var context = new BronieContext(serviceProvider)) { Assert.Equal(0, context.EarthPonies.Count()); } }
public async Task Can_use_sequential_GUID_end_to_end_async() { var serviceProvider = new ServiceCollection() .AddEntityFrameworkSqlServer() .BuildServiceProvider(); using (var context = new BronieContext(serviceProvider, TestStore.Name)) { context.Database.EnsureCreated(); for (var i = 0; i < 50; i++) { context.Add(new Pegasus { Name = "Rainbow Dash " + i }); } await context.SaveChangesAsync(); } using (var context = new BronieContext(serviceProvider, TestStore.Name)) { var pegasuses = await context.Pegasuses.OrderBy(e => e.Id).ToListAsync(); for (var i = 0; i < 50; i++) { Assert.Equal("Rainbow Dash " + i, pegasuses[i].Name); } } }
public async Task Can_use_generated_values_in_composite_key_end_to_end() { var serviceProvider = new ServiceCollection() .AddEntityFramework() .AddSqlServer() .UseLoggerFactory <LoggerFactory>() .ServiceCollection .BuildServiceProvider(); long id1; var id2 = DateTime.UtcNow.Ticks.ToString(CultureInfo.InvariantCulture); Guid id3; using (var context = new BronieContext(serviceProvider, "CompositeUnicorns")) { context.Database.EnsureCreated(); var added = await context.AddAsync(new Unicorn { Id2 = id2, Name = "Rarity" }); Assert.True(added.Id1 < 0); Assert.NotEqual(Guid.Empty, added.Id3); await context.SaveChangesAsync(); Assert.True(added.Id1 > 0); id1 = added.Id1; id3 = added.Id3; } using (var context = new BronieContext(serviceProvider, "CompositeUnicorns")) { Assert.Equal(1, context.Unicorns.Count(e => e.Id1 == id1 && e.Id2 == id2 && e.Id3 == id3)); } using (var context = new BronieContext(serviceProvider, "CompositeUnicorns")) { var unicorn = context.Unicorns.Single(e => e.Id1 == id1 && e.Id2 == id2 && e.Id3 == id3); unicorn.Name = "Bad Hair Day"; await context.SaveChangesAsync(); } using (var context = new BronieContext(serviceProvider, "CompositeUnicorns")) { var unicorn = context.Unicorns.Single(e => e.Id1 == id1 && e.Id2 == id2 && e.Id3 == id3); Assert.Equal("Bad Hair Day", unicorn.Name); context.Unicorns.Remove(unicorn); await context.SaveChangesAsync(); } using (var context = new BronieContext(serviceProvider, "CompositeUnicorns")) { Assert.Equal(0, context.Unicorns.Count(e => e.Id1 == id1 && e.Id2 == id2 && e.Id3 == id3)); } }
public async Task Can_use_sequential_GUID_end_to_end_async() { var serviceProvider = new ServiceCollection() .AddEntityFrameworkSqlServer() .BuildServiceProvider(); using (var context = new BronieContext(serviceProvider, "GooieBronies")) { context.Database.EnsureDeleted(); context.Database.EnsureCreated(); for (var i = 0; i < 50; i++) { context.Add(new Pegasus { Name = "Rainbow Dash " + i }); } await context.SaveChangesAsync(); } using (var context = new BronieContext(serviceProvider, "GooieBronies")) { var pegasuses = await context.Pegasuses.OrderBy(e => e.Id).ToListAsync(); for (var i = 0; i < 50; i++) { Assert.Equal("Rainbow Dash " + i, pegasuses[i].Name); } } }
public async Task Can_use_explicit_values() { var serviceProvider = new ServiceCollection() .AddEntityFrameworkSqlServer() .BuildServiceProvider(); var guids = new List<Guid>(); using (var context = new BronieContext(serviceProvider, "GooieExplicitBronies")) { context.Database.EnsureDeleted(); context.Database.EnsureCreated(); for (var i = 0; i < 50; i++) { guids.Add(context.Add(new Pegasus { Name = "Rainbow Dash " + i, Index = i, Id = Guid.NewGuid() }).Entity.Id); } await context.SaveChangesAsync(); } using (var context = new BronieContext(serviceProvider, "GooieExplicitBronies")) { var pegasuses = await context.Pegasuses.OrderBy(e => e.Index).ToListAsync(); for (var i = 0; i < 50; i++) { Assert.Equal("Rainbow Dash " + i, pegasuses[i].Name); Assert.Equal(guids[i], pegasuses[i].Id); } } }
public async Task Can_use_generated_values_in_composite_key_end_to_end() { var serviceProvider = new ServiceCollection() .AddEntityFramework() .AddSqlServer() .ServiceCollection() .BuildServiceProvider(); long id1; var id2 = DateTime.UtcNow.Ticks.ToString(CultureInfo.InvariantCulture); Guid id3; using (var context = new BronieContext(serviceProvider, "CompositeUnicorns")) { context.Database.EnsureCreated(); var added = context.Add(new Unicorn { Id2 = id2, Name = "Rarity" }).Entity; Assert.True(added.Id1 < 0); Assert.NotEqual(Guid.Empty, added.Id3); await context.SaveChangesAsync(); Assert.True(added.Id1 > 0); id1 = added.Id1; id3 = added.Id3; } using (var context = new BronieContext(serviceProvider, "CompositeUnicorns")) { Assert.Equal(1, context.Unicorns.Count(e => e.Id1 == id1 && e.Id2 == id2 && e.Id3 == id3)); } using (var context = new BronieContext(serviceProvider, "CompositeUnicorns")) { var unicorn = context.Unicorns.Single(e => e.Id1 == id1 && e.Id2 == id2 && e.Id3 == id3); unicorn.Name = "Bad Hair Day"; await context.SaveChangesAsync(); } using (var context = new BronieContext(serviceProvider, "CompositeUnicorns")) { var unicorn = context.Unicorns.Single(e => e.Id1 == id1 && e.Id2 == id2 && e.Id3 == id3); Assert.Equal("Bad Hair Day", unicorn.Name); context.Unicorns.Remove(unicorn); await context.SaveChangesAsync(); } using (var context = new BronieContext(serviceProvider, "CompositeUnicorns")) { Assert.Equal(0, context.Unicorns.Count(e => e.Id1 == id1 && e.Id2 == id2 && e.Id3 == id3)); } }
public async Task Only_one_part_of_a_composite_key_needs_to_vary_for_uniqueness() { var serviceProvider = new ServiceCollection() .AddEntityFramework() .AddSqlite() .ServiceCollection() .BuildServiceProvider(); var ids = new int[3]; using (var context = new BronieContext(serviceProvider, "CompositeEarthPonies")) { context.Database.EnsureCreated(); var pony1 = context.Add(new EarthPony { Id1 = 1, Id2 = 7, Name = "Apple Jack 1" }).Entity; var pony2 = context.Add(new EarthPony { Id1 = 2, Id2 = 7, Name = "Apple Jack 2" }).Entity; var pony3 = context.Add(new EarthPony { Id1 = 3, Id2 = 7, Name = "Apple Jack 3" }).Entity; await context.SaveChangesAsync(); ids[0] = pony1.Id1; ids[1] = pony2.Id1; ids[2] = pony3.Id1; } using (var context = new BronieContext(serviceProvider, "CompositeEarthPonies")) { var ponies = context.EarthPonies.ToList(); Assert.Equal(ponies.Count, ponies.Count(e => e.Name == "Apple Jack 1") * 3); Assert.Equal("Apple Jack 1", ponies.Single(e => e.Id1 == ids[0]).Name); Assert.Equal("Apple Jack 2", ponies.Single(e => e.Id1 == ids[1]).Name); Assert.Equal("Apple Jack 3", ponies.Single(e => e.Id1 == ids[2]).Name); ponies.Single(e => e.Id1 == ids[1]).Name = "Pinky Pie 2"; await context.SaveChangesAsync(); } using (var context = new BronieContext(serviceProvider, "CompositeEarthPonies")) { var ponies = context.EarthPonies.ToArray(); Assert.Equal(ponies.Length, ponies.Count(e => e.Name == "Apple Jack 1") * 3); Assert.Equal("Apple Jack 1", ponies.Single(e => e.Id1 == ids[0]).Name); Assert.Equal("Pinky Pie 2", ponies.Single(e => e.Id1 == ids[1]).Name); Assert.Equal("Apple Jack 3", ponies.Single(e => e.Id1 == ids[2]).Name); context.EarthPonies.RemoveRange(ponies); await context.SaveChangesAsync(); } using (var context = new BronieContext(serviceProvider, "CompositeEarthPonies")) { Assert.Equal(0, context.EarthPonies.Count()); } }
public async Task Can_use_generated_values_in_composite_key_end_to_end() { var serviceProvider = new ServiceCollection() .AddEntityFrameworkInMemoryDatabase() .BuildServiceProvider(validateScopes: true); long id1; var id2 = DateTime.UtcNow.Ticks.ToString(CultureInfo.InvariantCulture); Guid id3; using (var context = new BronieContext(serviceProvider)) { var added = context.Add( new Unicorn { Id2 = id2, Name = "Rarity" }).Entity; Assert.True(added.Id1 > 0); Assert.NotEqual(Guid.Empty, added.Id3); await context.SaveChangesAsync(); id1 = added.Id1; id3 = added.Id3; } using (var context = new BronieContext(serviceProvider)) { Assert.Equal(1, context.Unicorns.Count(e => (e.Id1 == id1) && (e.Id2 == id2) && (e.Id3 == id3))); } using (var context = new BronieContext(serviceProvider)) { var unicorn = context.Unicorns.Single(e => (e.Id1 == id1) && (e.Id2 == id2) && (e.Id3 == id3)); unicorn.Name = "Bad Hair Day"; await context.SaveChangesAsync(); } using (var context = new BronieContext(serviceProvider)) { var unicorn = context.Unicorns.Single(e => (e.Id1 == id1) && (e.Id2 == id2) && (e.Id3 == id3)); Assert.Equal("Bad Hair Day", unicorn.Name); context.Unicorns.Remove(unicorn); await context.SaveChangesAsync(); } using (var context = new BronieContext(serviceProvider)) { Assert.Equal(0, context.Unicorns.Count(e => (e.Id1 == id1) && (e.Id2 == id2) && (e.Id3 == id3))); } }
private static async Task AddEntitiesAsync(IServiceProvider serviceProvider) { using (var context = new BronieContext(serviceProvider)) { for (var i = 0; i < 50; i++) { context.Add(new Pegasus { Name = "Rainbow Dash " + i }); context.Add(new Pegasus { Name = "Fluttershy " + i }); } await context.SaveChangesAsync(); } }
private static void AddEntities(IServiceProvider serviceProvider) { using (var context = new BronieContext(serviceProvider, "Bronies")) { for (var i = 0; i < 10; i++) { context.Add(new Pegasus { Name = "Rainbow Dash " + i }); context.Add(new Pegasus { Name = "Fluttershy " + i }); } context.SaveChanges(); } }
private static async Task AddEntitiesAsync(IServiceProvider serviceProvider, string databaseName) { using (var context = new BronieContext(serviceProvider, databaseName)) { for (var i = 0; i < 10; i++) { await context.AddAsync(new Pegasus { Name = "Rainbow Dash " + i }); await context.AddAsync(new Pegasus { Name = "Fluttershy " + i }); } await context.SaveChangesAsync(); } }
private static void AddEntities(IServiceProvider serviceProvider, string name) { using (var context = new BronieContext(serviceProvider, name)) { for (var i = 0; i < 10; i++) { context.Add( new Pegasus { Name = "Rainbow Dash " + i }); context.Add( new Pegasus { Name = "Fluttershy " + i }); } context.SaveChanges(); } }
private static void AddEntitiesWithIds(IServiceProvider serviceProvider, int idOffset, string name) { using (var context = new BronieContext(serviceProvider, name)) { for (var i = 1; i < 11; i++) { context.Add( new Pegasus { Name = "Rainbow Dash " + i, Identifier = i * 100 + idOffset }); context.Add( new Pegasus { Name = "Fluttershy " + i, Identifier = i * 100 + idOffset + 1 }); } context.SaveChanges(); } }
private static void CreateDatabaseSequence(BronieContext context, DataStoreConnection storeConnection) { var executor = new SqlStatementExecutor(); var operations = new SqlServerSequenceValueGeneratorFactory(executor) .GetUpMigrationOperations(context.Model.GetEntityType(typeof(Pegasus)) .GetProperty("Identifier")); var sql = new SqlServerMigrationOperationSqlGenerator(new SqlServerTypeMapper()) .Generate(operations, generateIdempotentSql: false); // TODO: Should be able to get relational connection without cast var connection = ((RelationalConnection)storeConnection).DbConnection; executor.ExecuteNonQuery(connection, sql); }
public void Can_use_sequence_end_to_end_on_multiple_databases() { var serviceProvider = new ServiceCollection() .AddEntityFrameworkSqlServer() .BuildServiceProvider(); var dbOne = TestStore.Name + "1"; var dbTwo = TestStore.Name + "2"; foreach (var dbName in new[] { dbOne, dbTwo }) { using (var context = new BronieContext(serviceProvider, dbName)) { context.Database.EnsureDeleted(); Thread.Sleep(100); context.Database.EnsureCreatedResiliently(); } } AddEntitiesToMultipleContexts(serviceProvider, dbOne, dbTwo); AddEntitiesToMultipleContexts(serviceProvider, dbOne, dbTwo); // Use a different service provider so a different generator is used but with // the same server sequence. serviceProvider = new ServiceCollection() .AddEntityFrameworkSqlServer() .BuildServiceProvider(); AddEntitiesToMultipleContexts(serviceProvider, dbOne, dbTwo); foreach (var dbName in new[] { dbOne, dbTwo }) { using (var context = new BronieContext(serviceProvider, dbName)) { var pegasuses = context.Pegasuses.ToList(); for (var i = 0; i < 29; i++) { Assert.Equal( dbName.EndsWith("1", StringComparison.Ordinal) ? 3 : 0, pegasuses.Count(p => p.Name == "Rainbow Dash " + i)); Assert.Equal(3, pegasuses.Count(p => p.Name == "Fluttershy " + i)); } } } }
private static async Task AddEntitiesAsync(IServiceProvider serviceProvider) { using var context = new BronieContext(serviceProvider); for (var i = 0; i < 50; i++) { context.Add( new Pegasus { Name = "Rainbow Dash " + i }); context.Add( new Pegasus { Name = "Fluttershy " + i }); } await context.SaveChangesAsync(); }
public void Can_use_explicit_values() { var serviceProvider = new ServiceCollection() .AddEntityFramework() .AddSqlServer() .UseLoggerFactory <LoggerFactory>() .ServiceCollection .BuildServiceProvider(); using (var context = new BronieContext(serviceProvider, "ExplicitBronies")) { context.Database.EnsureDeleted(); context.Database.EnsureCreated(); } AddEntitiesWithIds(serviceProvider, 0); AddEntitiesWithIds(serviceProvider, 2); // Use a different service provider so a different generator pool is used but with // the same server sequence. serviceProvider = new ServiceCollection() .AddEntityFramework() .AddSqlServer() .UseLoggerFactory <LoggerFactory>() .ServiceCollection .BuildServiceProvider(); AddEntitiesWithIds(serviceProvider, 4); using (var context = new BronieContext(serviceProvider, "ExplicitBronies")) { var pegasuses = context.Pegasuses.ToList(); for (var i = 1; i < 11; i++) { Assert.Equal(3, pegasuses.Count(p => p.Name == "Rainbow Dash " + i)); Assert.Equal(3, pegasuses.Count(p => p.Name == "Fluttershy " + i)); for (var j = 0; j < 6; j++) { pegasuses.Single(p => p.Identifier == i * 100 + j); } } } }
public async Task Can_use_two_non_generated_integers_as_composite_key_end_to_end() { var serviceProvider = new ServiceCollection() .AddEntityFramework() .AddSqlServer() .ServiceCollection() .BuildServiceProvider(); var ticks = DateTime.UtcNow.Ticks; using (var context = new BronieContext(serviceProvider, "CompositePegasuses")) { context.Database.EnsureCreated(); context.Add(new Pegasus { Id1 = ticks, Id2 = ticks + 1, Name = "Rainbow Dash" }); await context.SaveChangesAsync(); } using (var context = new BronieContext(serviceProvider, "CompositePegasuses")) { var pegasus = context.Pegasuses.Single(e => e.Id1 == ticks && e.Id2 == ticks + 1); pegasus.Name = "Rainbow Crash"; await context.SaveChangesAsync(); } using (var context = new BronieContext(serviceProvider, "CompositePegasuses")) { var pegasus = context.Pegasuses.Single(e => e.Id1 == ticks && e.Id2 == ticks + 1); Assert.Equal("Rainbow Crash", pegasus.Name); context.Pegasuses.Remove(pegasus); await context.SaveChangesAsync(); } using (var context = new BronieContext(serviceProvider, "CompositePegasuses")) { Assert.Equal(0, context.Pegasuses.Count(e => e.Id1 == ticks && e.Id2 == ticks + 1)); } }
public async Task Can_use_sequence_end_to_end_from_multiple_contexts_concurrently_async() { var serviceProvider = new ServiceCollection() .AddEntityFramework() .AddSqlServer() .ServiceCollection .BuildServiceProvider(); using (var context = new BronieContext(serviceProvider, "ManyBronies")) { context.Database.EnsureDeleted(); context.Database.EnsureCreated(); // TODO: Integrate sequence generation into Migrations CreateDatabaseSequence(context, context.Database.Connection); } const int threadCount = 50; var tests = new Func <Task> [threadCount]; for (var i = 0; i < threadCount; i++) { var closureProvider = serviceProvider; tests[i] = () => AddEntitiesAsync(closureProvider, "ManyBronies"); } var tasks = tests.Select(Task.Run).ToArray(); foreach (var t in tasks) { await t; } using (var context = new BronieContext(serviceProvider, "ManyBronies")) { var pegasuses = await context.Pegasuses.ToListAsync(); for (var i = 0; i < 50; i++) { Assert.Equal(threadCount, pegasuses.Count(p => p.Name == "Rainbow Dash " + i)); Assert.Equal(threadCount, pegasuses.Count(p => p.Name == "Fluttershy " + i)); } } }
public async Task Can_use_sequence_end_to_end_async() { var serviceProvider = new ServiceCollection() .AddEntityFrameworkInMemoryDatabase() .BuildServiceProvider(); await AddEntitiesAsync(serviceProvider); await AddEntitiesAsync(serviceProvider); using var context = new BronieContext(serviceProvider); var pegasuses = await context.Pegasuses.ToListAsync(); for (var i = 0; i < 50; i++) { Assert.True(pegasuses.All(p => p.Id > 0)); Assert.Equal(2, pegasuses.Count(p => p.Name == "Rainbow Dash " + i)); Assert.Equal(2, pegasuses.Count(p => p.Name == "Fluttershy " + i)); } }
public void Can_use_sequence_end_to_end() { var serviceProvider = new ServiceCollection() .AddEntityFramework() .AddSqlServer() .ServiceCollection .BuildServiceProvider(); using (var context = new BronieContext(serviceProvider, "Bronies")) { context.Database.EnsureDeleted(); context.Database.EnsureCreated(); // TODO: Integrate sequence generation into Migrations CreateDatabaseSequence(context, context.Database.Connection); } AddEntities(serviceProvider); AddEntities(serviceProvider); // Use a different service provider so a different generator pool is used but with // the same server sequence. serviceProvider = new ServiceCollection() .AddEntityFramework() .AddSqlServer() .ServiceCollection .BuildServiceProvider(); AddEntities(serviceProvider); using (var context = new BronieContext(serviceProvider, "Bronies")) { var pegasuses = context.Pegasuses.ToList(); for (var i = 0; i < 50; i++) { Assert.Equal(3, pegasuses.Count(p => p.Name == "Rainbow Dash " + i)); Assert.Equal(3, pegasuses.Count(p => p.Name == "Fluttershy " + i)); } } }
public void Can_use_sequence_end_to_end() { var serviceProvider = new ServiceCollection() .AddEntityFramework() .AddSqlServer() .ServiceCollection .BuildServiceProvider(); using (var context = new BronieContext(serviceProvider, "Bronies")) { context.Database.EnsureDeleted(); context.Database.EnsureCreated(); // TODO: Integrate sequence generation into Migrations CreateDatabaseSequence(context, context.Database.AsRelational().Connection); } AddEntities(serviceProvider); AddEntities(serviceProvider); // Use a different service provider so a different generator pool is used but with // the same server sequence. serviceProvider = new ServiceCollection() .AddEntityFramework() .AddSqlServer() .ServiceCollection .BuildServiceProvider(); AddEntities(serviceProvider); using (var context = new BronieContext(serviceProvider, "Bronies")) { var pegasuses = context.Pegasuses.ToList(); for (var i = 0; i < 50; i++) { Assert.Equal(3, pegasuses.Count(p => p.Name == "Rainbow Dash " + i)); Assert.Equal(3, pegasuses.Count(p => p.Name == "Fluttershy " + i)); } } }
public async Task Can_use_sequence_end_to_end_async() { var serviceProvider = new ServiceCollection() .AddEntityFrameworkInMemoryDatabase() .BuildServiceProvider(); await AddEntitiesAsync(serviceProvider); await AddEntitiesAsync(serviceProvider); using (var context = new BronieContext(serviceProvider)) { var pegasuses = await context.Pegasuses.ToListAsync(); for (var i = 0; i < 50; i++) { Assert.True(pegasuses.All(p => p.Id > 0)); Assert.Equal(2, pegasuses.Count(p => p.Name == "Rainbow Dash " + i)); Assert.Equal(2, pegasuses.Count(p => p.Name == "Fluttershy " + i)); } } }
public async Task Can_use_sequence_end_to_end_from_multiple_contexts_concurrently_async() { var serviceProvider = new ServiceCollection() .AddEntityFrameworkSqlServer() .BuildServiceProvider(validateScopes: true); using (var context = new BronieContext(serviceProvider, TestStore.Name)) { context.Database.EnsureCreatedResiliently(); } const int threadCount = 50; var tests = new Func <Task> [threadCount]; for (var i = 0; i < threadCount; i++) { var closureProvider = serviceProvider; tests[i] = () => AddEntitiesAsync(closureProvider, TestStore.Name); } var tasks = tests.Select(Task.Run).ToArray(); foreach (var t in tasks) { await t; } using (var context = new BronieContext(serviceProvider, TestStore.Name)) { var pegasuses = await context.Pegasuses.ToListAsync(); for (var i = 0; i < 10; i++) { Assert.Equal(threadCount, pegasuses.Count(p => p.Name == "Rainbow Dash " + i)); Assert.Equal(threadCount, pegasuses.Count(p => p.Name == "Fluttershy " + i)); } } }
public void Can_use_explicit_values() { var serviceProvider = new ServiceCollection() .AddEntityFrameworkNpgsql() .BuildServiceProvider(); using (var context = new BronieContext(serviceProvider, TestStore.Name)) { context.Database.EnsureCreatedResiliently(); } AddEntitiesWithIds(serviceProvider, 0, TestStore.Name); AddEntitiesWithIds(serviceProvider, 2, TestStore.Name); // Use a different service provider so a different generator is used but with // the same server sequence. serviceProvider = new ServiceCollection() .AddEntityFrameworkNpgsql() .BuildServiceProvider(); AddEntitiesWithIds(serviceProvider, 4, TestStore.Name); using (var context = new BronieContext(serviceProvider, TestStore.Name)) { var pegasuses = context.Pegasuses.ToList(); for (var i = 1; i < 11; i++) { Assert.Equal(3, pegasuses.Count(p => p.Name == "Rainbow Dash " + i)); Assert.Equal(3, pegasuses.Count(p => p.Name == "Fluttershy " + i)); for (var j = 0; j < 6; j++) { pegasuses.Single(p => p.Identifier == i * 100 + j); } } } }
public void Can_use_sequence_end_to_end() { var serviceProvider = new ServiceCollection() .AddEntityFramework() .AddInMemoryStore() .ServiceCollection() .BuildServiceProvider(); AddEntities(serviceProvider); AddEntities(serviceProvider); using (var context = new BronieContext(serviceProvider)) { var pegasuses = context.Pegasuses.ToList(); for (var i = 0; i < 50; i++) { Assert.True(pegasuses.All(p => p.Id > 0)); Assert.Equal(2, pegasuses.Count(p => p.Name == "Rainbow Dash " + i)); Assert.Equal(2, pegasuses.Count(p => p.Name == "Fluttershy " + i)); } } }
public void Can_use_sequence_end_to_end() { var serviceProvider = new ServiceCollection() .AddEntityFramework() .AddInMemoryStore() .ServiceCollection .BuildServiceProvider(); AddEntities(serviceProvider); AddEntities(serviceProvider); using (var context = new BronieContext(serviceProvider)) { var pegasuses = context.Pegasuses.ToList(); for (var i = 0; i < 50; i++) { Assert.True(pegasuses.All(p => p.Id > 0)); Assert.Equal(2, pegasuses.Count(p => p.Name == "Rainbow Dash " + i)); Assert.Equal(2, pegasuses.Count(p => p.Name == "Fluttershy " + i)); } } }
private static void CreateDatabaseSequence(BronieContext context, RelationalConnection storeConnection) { var executor = new SqlStatementExecutor(); var operations = new SqlServerSequenceValueGeneratorFactory(executor) .GetUpMigrationOperations(context.Model.GetEntityType(typeof(Pegasus)) .GetProperty("Identifier")); var sql = new SqlServerMigrationOperationSqlGenerator(new SqlServerTypeMapper()) .Generate(operations); // TODO: Should be able to get relational connection without cast var connection = storeConnection.DbConnection; executor.ExecuteNonQuery(connection, storeConnection.DbTransaction, sql); }
// [ConditionalFact] Currently disabled due to GitHub issue #266 public async Task Can_use_sequence_end_to_end_from_multiple_contexts_concurrently_async() { var serviceProvider = new ServiceCollection() .AddEntityFrameworkSqlServer() .BuildServiceProvider(); using (var context = new BronieContext(serviceProvider, "ManyBronies")) { context.Database.EnsureDeleted(); context.Database.EnsureCreated(); } const int threadCount = 50; var tests = new Func<Task>[threadCount]; for (var i = 0; i < threadCount; i++) { var closureProvider = serviceProvider; tests[i] = () => AddEntitiesAsync(closureProvider, "ManyBronies"); } var tasks = tests.Select(Task.Run).ToArray(); foreach (var t in tasks) { await t; } using (var context = new BronieContext(serviceProvider, "ManyBronies")) { var pegasuses = await context.Pegasuses.ToListAsync(); for (var i = 0; i < 50; i++) { Assert.Equal(threadCount, pegasuses.Count(p => p.Name == "Rainbow Dash " + i)); Assert.Equal(threadCount, pegasuses.Count(p => p.Name == "Fluttershy " + i)); } } }
public void Can_use_explicit_values() { var serviceProvider = new ServiceCollection() .AddEntityFrameworkSqlServer() .BuildServiceProvider(); using (var context = new BronieContext(serviceProvider, "ExplicitBronies")) { context.Database.EnsureDeleted(); context.Database.EnsureCreated(); } AddEntitiesWithIds(serviceProvider, 0); AddEntitiesWithIds(serviceProvider, 2); // Use a different service provider so a different generator is used but with // the same server sequence. serviceProvider = new ServiceCollection() .AddEntityFrameworkSqlServer() .BuildServiceProvider(); AddEntitiesWithIds(serviceProvider, 4); using (var context = new BronieContext(serviceProvider, "ExplicitBronies")) { var pegasuses = context.Pegasuses.ToList(); for (var i = 1; i < 11; i++) { Assert.Equal(3, pegasuses.Count(p => p.Name == "Rainbow Dash " + i)); Assert.Equal(3, pegasuses.Count(p => p.Name == "Fluttershy " + i)); for (var j = 0; j < 6; j++) { pegasuses.Single(p => p.Identifier == i * 100 + j); } } } }
public async Task Only_one_part_of_a_composite_key_needs_to_vary_for_uniquness() { var serviceProvider = new ServiceCollection() .AddEntityFramework() .AddSqlServer() .UseLoggerFactory <LoggerFactory>() .ServiceCollection .BuildServiceProvider(); var ids = new int[3]; using (var context = new BronieContext(serviceProvider, "CompositeEarthPonies")) { context.Database.EnsureCreated(); var pony1 = await context.AddAsync(new EarthPony { Id2 = 7, Name = "Apple Jack 1" }); var pony2 = await context.AddAsync(new EarthPony { Id2 = 7, Name = "Apple Jack 2" }); var pony3 = await context.AddAsync(new EarthPony { Id2 = 7, Name = "Apple Jack 3" }); await context.SaveChangesAsync(); ids[0] = pony1.Id1; ids[1] = pony2.Id1; ids[2] = pony3.Id1; } using (var context = new BronieContext(serviceProvider, "CompositeEarthPonies")) { var ponies = context.EarthPonies.ToList(); Assert.Equal(ponies.Count, ponies.Count(e => e.Name == "Apple Jack 1") * 3); Assert.Equal("Apple Jack 1", ponies.Single(e => e.Id1 == ids[0]).Name); Assert.Equal("Apple Jack 2", ponies.Single(e => e.Id1 == ids[1]).Name); Assert.Equal("Apple Jack 3", ponies.Single(e => e.Id1 == ids[2]).Name); ponies.Single(e => e.Id1 == ids[1]).Name = "Pinky Pie 2"; await context.SaveChangesAsync(); } using (var context = new BronieContext(serviceProvider, "CompositeEarthPonies")) { var ponies = context.EarthPonies.ToList(); Assert.Equal(ponies.Count, ponies.Count(e => e.Name == "Apple Jack 1") * 3); Assert.Equal("Apple Jack 1", ponies.Single(e => e.Id1 == ids[0]).Name); Assert.Equal("Pinky Pie 2", ponies.Single(e => e.Id1 == ids[1]).Name); Assert.Equal("Apple Jack 3", ponies.Single(e => e.Id1 == ids[2]).Name); context.EarthPonies.RemoveRange(ponies); await context.SaveChangesAsync(); } using (var context = new BronieContext(serviceProvider, "CompositeEarthPonies")) { Assert.Equal(0, context.EarthPonies.Count()); } }
private static void AddEntitiesWithIds(IServiceProvider serviceProvider, int idOffset) { using (var context = new BronieContext(serviceProvider, "ExplicitBronies")) { for (var i = 1; i < 11; i++) { context.Add(new Pegasus { Name = "Rainbow Dash " + i, Identifier = i * 100 + idOffset }); context.Add(new Pegasus { Name = "Fluttershy " + i, Identifier = i * 100 + idOffset + 1 }); } context.SaveChanges(); } }
public async Task Only_one_part_of_a_composite_key_needs_to_vary_for_uniquness() { var serviceProvider = new ServiceCollection() .AddEntityFramework() .AddInMemoryStore() .ServiceCollection .BuildServiceProvider(); var ids = new int[3]; using (var context = new BronieContext(serviceProvider)) { var pony1 = await context.AddAsync(new EarthPony { Id2 = 7, Name = "Apple Jack 1" }); var pony2 = await context.AddAsync(new EarthPony { Id2 = 7, Name = "Apple Jack 2" }); var pony3 = await context.AddAsync(new EarthPony { Id2 = 7, Name = "Apple Jack 3" }); await context.SaveChangesAsync(); ids[0] = pony1.Id1; ids[1] = pony2.Id1; ids[2] = pony3.Id1; } using (var context = new BronieContext(serviceProvider)) { var ponies = context.EarthPonies.ToList(); Assert.Equal(ponies.Count, ponies.Count(e => e.Name == "Apple Jack 1") * 3); Assert.Equal("Apple Jack 1", ponies.Single(e => e.Id1 == ids[0]).Name); Assert.Equal("Apple Jack 2", ponies.Single(e => e.Id1 == ids[1]).Name); Assert.Equal("Apple Jack 3", ponies.Single(e => e.Id1 == ids[2]).Name); ponies.Single(e => e.Id1 == ids[1]).Name = "Pinky Pie 2"; await context.SaveChangesAsync(); } using (var context = new BronieContext(serviceProvider)) { var ponies = context.EarthPonies.ToList(); Assert.Equal(ponies.Count, ponies.Count(e => e.Name == "Apple Jack 1") * 3); Assert.Equal("Apple Jack 1", ponies.Single(e => e.Id1 == ids[0]).Name); Assert.Equal("Pinky Pie 2", ponies.Single(e => e.Id1 == ids[1]).Name); Assert.Equal("Apple Jack 3", ponies.Single(e => e.Id1 == ids[2]).Name); context.EarthPonies.RemoveRange(ponies); await context.SaveChangesAsync(); } using (var context = new BronieContext(serviceProvider)) { Assert.Equal(0, context.EarthPonies.Count()); } }