diff --git a/src/EntityFramework.Migrations/Infrastructure/HistoryRepository.cs b/src/EntityFramework.Migrations/Infrastructure/HistoryRepository.cs index c1a9adbc481..494cbb86e59 100644 --- a/src/EntityFramework.Migrations/Infrastructure/HistoryRepository.cs +++ b/src/EntityFramework.Migrations/Infrastructure/HistoryRepository.cs @@ -146,7 +146,7 @@ public virtual IReadOnlyList GenerateDeleteMigrationSql( Check.NotNull(sqlGenerator, "sqlGenerator"); // TODO: Implement a mechanism to capture the SQL generated by - // the update pipeline (context.Delete, context.SaveChanges) and use here. + // the update pipeline (context.Remove, context.SaveChanges) and use here. var stringBuilder = new StringBuilder(); stringBuilder diff --git a/src/EntityFramework/DbContext.cs b/src/EntityFramework/DbContext.cs index ee275219652..a7b9669aa01 100644 --- a/src/EntityFramework/DbContext.cs +++ b/src/EntityFramework/DbContext.cs @@ -2,6 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; using System.Threading; using System.Threading.Tasks; using JetBrains.Annotations; @@ -14,7 +17,6 @@ using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Logging; using Microsoft.Framework.OptionsModel; -using System.Diagnostics; namespace Microsoft.Data.Entity { @@ -248,53 +250,250 @@ public virtual void Dispose() } } - public virtual TEntity Add([NotNull] TEntity entity) + public virtual EntityEntry Add([NotNull] TEntity entity) { Check.NotNull(entity, "entity"); - GetStateManager() - .GetOrCreateEntry(entity) - .EntityState = EntityState.Added; - - return entity; + return SetEntityState(entity, EntityState.Added); } - public virtual async Task AddAsync( + public virtual async Task> AddAsync( [NotNull] TEntity entity, CancellationToken cancellationToken = default(CancellationToken)) { Check.NotNull(entity, "entity"); - await GetStateManager() - .GetOrCreateEntry(entity) + var entry = ChangeTracker.Entry(entity); + + await entry.StateEntry .SetEntityStateAsync(EntityState.Added, cancellationToken) .WithCurrentCulture(); - return entity; + return entry; + } + + public virtual EntityEntry Attach([NotNull] TEntity entity) + { + Check.NotNull(entity, "entity"); + + return SetEntityState(entity, EntityState.Unchanged); + } + + public virtual EntityEntry Update([NotNull] TEntity entity) + { + Check.NotNull(entity, "entity"); + + return SetEntityState(entity, EntityState.Modified); + } + + public virtual EntityEntry Remove([NotNull] TEntity entity) + { + Check.NotNull(entity, "entity"); + + return SetEntityState(entity, EntityState.Deleted); } - public virtual TEntity Update([NotNull] TEntity entity) + private EntityEntry SetEntityState(TEntity entity, EntityState entityState) + { + var entry = ChangeTracker.Entry(entity); + + entry.State = entityState; + + return entry; + } + + public virtual EntityEntry Add([NotNull] object entity) { Check.NotNull(entity, "entity"); - ChangeTracker.Entry(entity).State = EntityState.Modified; + return SetEntityState(entity, EntityState.Added); + } + + public virtual async Task AddAsync( + [NotNull] object entity, CancellationToken cancellationToken = default(CancellationToken)) + { + Check.NotNull(entity, "entity"); + + var entry = ChangeTracker.Entry(entity); + + await entry.StateEntry + .SetEntityStateAsync(EntityState.Added, cancellationToken) + .WithCurrentCulture(); + + return entry; + } - return entity; + public virtual EntityEntry Attach([NotNull] object entity) + { + Check.NotNull(entity, "entity"); + + return SetEntityState(entity, EntityState.Unchanged); } - public virtual Task UpdateAsync([NotNull] TEntity entity, CancellationToken cancellationToken = default(CancellationToken)) + public virtual EntityEntry Update([NotNull] object entity) { Check.NotNull(entity, "entity"); - return Task.FromResult(Update(entity)); + return SetEntityState(entity, EntityState.Modified); } - public virtual TEntity Delete([NotNull] TEntity entity) + public virtual EntityEntry Remove([NotNull] object entity) { Check.NotNull(entity, "entity"); - ChangeTracker.Entry(entity).State = EntityState.Deleted; + return SetEntityState(entity, EntityState.Deleted); + } + + private EntityEntry SetEntityState(object entity, EntityState entityState) + { + var entry = ChangeTracker.Entry(entity); + + entry.State = entityState; + + return entry; + } + + public virtual IReadOnlyList> Add([NotNull] params TEntity[] entities) + { + Check.NotNull(entities, "entities"); + + return SetEntityStates(entities, EntityState.Added); + } + + public virtual Task>> AddAsync([NotNull] params TEntity[] entities) + { + Check.NotNull(entities, "entities"); + + return AddAsync(entities, default(CancellationToken)); + } + + public virtual async Task>> AddAsync( + [NotNull] TEntity[] entities, + CancellationToken cancellationToken) + { + Check.NotNull(entities, "entities"); + + var entries = GetOrCreateEntries(entities); + + foreach (var entry in entries) + { + await entry.StateEntry + .SetEntityStateAsync(EntityState.Added, cancellationToken) + .WithCurrentCulture(); + } + + return entries; + } + + public virtual IReadOnlyList> Attach([NotNull] params TEntity[] entities) + { + Check.NotNull(entities, "entities"); + + return SetEntityStates(entities, EntityState.Unchanged); + } + + public virtual IReadOnlyList> Update([NotNull] params TEntity[] entities) + { + Check.NotNull(entities, "entities"); + + return SetEntityStates(entities, EntityState.Modified); + } + + public virtual IReadOnlyList> Remove([NotNull] params TEntity[] entities) + { + Check.NotNull(entities, "entities"); + + return SetEntityStates(entities, EntityState.Deleted); + } + + private List> SetEntityStates(TEntity[] entities, EntityState entityState) + { + var entries = GetOrCreateEntries(entities); + + foreach (var entry in entries) + { + entry.State = entityState; + } + + return entries; + } + + private List> GetOrCreateEntries(IEnumerable entities) + { + var changeTracker = ChangeTracker; + + return entities.Select(e => changeTracker.Entry(e)).ToList(); + } + + public virtual IReadOnlyList Add([NotNull] params object[] entities) + { + Check.NotNull(entities, "entities"); + + return SetEntityStates(entities, EntityState.Added); + } + + public virtual Task> AddAsync([NotNull] params object[] entities) + { + Check.NotNull(entities, "entities"); + + return AddAsync(entities, default(CancellationToken)); + } + + public virtual async Task> AddAsync( + [NotNull] object[] entities, + CancellationToken cancellationToken) + { + Check.NotNull(entities, "entities"); + + var entries = GetOrCreateEntries(entities); + + foreach (var entry in entries) + { + await entry.StateEntry + .SetEntityStateAsync(EntityState.Added, cancellationToken) + .WithCurrentCulture(); + } + + return entries; + } + + public virtual IReadOnlyList Attach([NotNull] params object[] entities) + { + Check.NotNull(entities, "entities"); + + return SetEntityStates(entities, EntityState.Unchanged); + } + + public virtual IReadOnlyList Update([NotNull] params object[] entities) + { + Check.NotNull(entities, "entities"); + + return SetEntityStates(entities, EntityState.Modified); + } + + public virtual IReadOnlyList Remove([NotNull] params object[] entities) + { + Check.NotNull(entities, "entities"); + + return SetEntityStates(entities, EntityState.Deleted); + } + + private List SetEntityStates(object[] entities, EntityState entityState) + { + var entries = GetOrCreateEntries(entities); + + foreach (var entry in entries) + { + entry.State = entityState; + } + + return entries; + } + + private List GetOrCreateEntries(IEnumerable entities) + { + var changeTracker = ChangeTracker; - return entity; + return entities.Select(e => changeTracker.Entry(e)).ToList(); } public virtual Database Database diff --git a/src/EntityFramework/DbSet`.cs b/src/EntityFramework/DbSet`.cs index 100312f746b..b7528d32d77 100644 --- a/src/EntityFramework/DbSet`.cs +++ b/src/EntityFramework/DbSet`.cs @@ -9,6 +9,7 @@ using System.Threading; using System.Threading.Tasks; using JetBrains.Annotations; +using Microsoft.Data.Entity.ChangeTracking; using Microsoft.Data.Entity.Infrastructure; using Microsoft.Data.Entity.Query; using Microsoft.Data.Entity.Utilities; @@ -43,14 +44,14 @@ public DbSet([NotNull] DbContext context) ((IDbContextServices)_context).ScopedServiceProvider.GetRequiredServiceChecked())); } - public virtual TEntity Add([NotNull] TEntity entity) + public virtual EntityEntry Add([NotNull] TEntity entity) { Check.NotNull(entity, "entity"); return _context.Add(entity); } - public virtual Task AddAsync( + public virtual Task> AddAsync( [NotNull] TEntity entity, CancellationToken cancellationToken = default(CancellationToken)) { Check.NotNull(entity, "entity"); @@ -58,56 +59,68 @@ public virtual Task AddAsync( return _context.AddAsync(entity, cancellationToken); } - public virtual TEntity Remove([NotNull] TEntity entity) + public virtual EntityEntry Attach([NotNull] TEntity entity) { Check.NotNull(entity, "entity"); - return _context.Delete(entity); + return _context.Attach(entity); } - public virtual TEntity Update([NotNull] TEntity entity) + public virtual EntityEntry Remove([NotNull] TEntity entity) { Check.NotNull(entity, "entity"); - return _context.Update(entity); + return _context.Remove(entity); } - public virtual Task UpdateAsync( - [NotNull] TEntity entity, CancellationToken cancellationToken = default(CancellationToken)) + public virtual EntityEntry Update([NotNull] TEntity entity) { Check.NotNull(entity, "entity"); - return _context.UpdateAsync(entity, cancellationToken); + return _context.Update(entity); + } + + public virtual IReadOnlyList> Add([NotNull] params TEntity[] entities) + { + Check.NotNull(entities, "entities"); + + return _context.Add(entities); + } + + public virtual Task>> AddAsync([NotNull] params TEntity[] entities) + { + Check.NotNull(entities, "entities"); + + return _context.AddAsync(entities); + } + + public virtual Task>> AddAsync( + CancellationToken cancellationToken, [NotNull] params TEntity[] entities) + { + Check.NotNull(entities, "entities"); + + return _context.AddAsync(entities, cancellationToken); } - public virtual void AddRange([NotNull] IEnumerable entities) + public virtual IReadOnlyList> Attach([NotNull] params TEntity[] entities) { Check.NotNull(entities, "entities"); - foreach (var entity in entities) - { - Add(entity); - } + return _context.Attach(entities); } - public virtual void RemoveRange([NotNull] IEnumerable entities) + public virtual IReadOnlyList> Remove([NotNull] params TEntity[] entities) { Check.NotNull(entities, "entities"); - foreach (var entity in entities) - { - Remove(entity); - } + return _context.Remove(entities); } - public virtual void UpdateRange([NotNull] IEnumerable entities) + public virtual IReadOnlyList> Update([NotNull] params TEntity[] entities) { Check.NotNull(entities, "entities"); - foreach (var entity in entities) - { - Update(entity); - } + return _context.Update(entities); } IEnumerator IEnumerable.GetEnumerator() diff --git a/test/EntityFramework.CrossStore.FunctionalTests/EndToEndTest.cs b/test/EntityFramework.CrossStore.FunctionalTests/EndToEndTest.cs index c8345c2f896..0be702c482d 100644 --- a/test/EntityFramework.CrossStore.FunctionalTests/EndToEndTest.cs +++ b/test/EntityFramework.CrossStore.FunctionalTests/EndToEndTest.cs @@ -20,12 +20,12 @@ public void Can_save_changes_and_query() { using (var context = CreateContext()) { - var first = context.SimpleEntities.Add(new SimpleEntity { StringProperty = "Entity 1" }); + var first = context.SimpleEntities.Add(new SimpleEntity { StringProperty = "Entity 1" }).Entity; SetPartitionId(first, context); Assert.Equal(1, context.SaveChanges()); - var second = context.SimpleEntities.Add(new SimpleEntity { Id = 42, StringProperty = "Entity 2"}); + var second = context.SimpleEntities.Add(new SimpleEntity { Id = 42, StringProperty = "Entity 2"}).Entity; // TODO: Replace with // context.ChangeTracker.Entry(entity).Property(SimpleEntity.ShadowPropertyName).CurrentValue = "shadow"; var property = context.Model.GetEntityType(typeof(SimpleEntity)).GetProperty(SimpleEntity.ShadowPropertyName); @@ -55,7 +55,7 @@ public void Can_save_changes_and_query() { Assert.Equal("first", context.SimpleEntities.Single().StringProperty); - context.SimpleEntities.RemoveRange(context.SimpleEntities); + context.SimpleEntities.Remove(context.SimpleEntities.ToArray()); context.SaveChanges(); } } diff --git a/test/EntityFramework.CrossStore.FunctionalTests/TestModels/CrossStoreContext.cs b/test/EntityFramework.CrossStore.FunctionalTests/TestModels/CrossStoreContext.cs index 76a32bc46e5..80a3c80528b 100644 --- a/test/EntityFramework.CrossStore.FunctionalTests/TestModels/CrossStoreContext.cs +++ b/test/EntityFramework.CrossStore.FunctionalTests/TestModels/CrossStoreContext.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Linq; using Microsoft.Data.Entity.Metadata; namespace Microsoft.Data.Entity.FunctionalTests.TestModels @@ -41,7 +42,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) public static void RemoveAllEntities(CrossStoreContext context) { - context.SimpleEntities.RemoveRange(context.SimpleEntities); + context.SimpleEntities.Remove(context.SimpleEntities.ToArray()); } } } diff --git a/test/EntityFramework.FunctionalTests/BuiltInDataTypesFixtureBase.cs b/test/EntityFramework.FunctionalTests/BuiltInDataTypesFixtureBase.cs index b2b94caf414..13f6cd2c899 100644 --- a/test/EntityFramework.FunctionalTests/BuiltInDataTypesFixtureBase.cs +++ b/test/EntityFramework.FunctionalTests/BuiltInDataTypesFixtureBase.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Linq; using Microsoft.Data.Entity.Metadata; namespace Microsoft.Data.Entity.FunctionalTests @@ -21,8 +22,8 @@ public virtual void OnModelCreating(ModelBuilder modelBuilder) public virtual void Cleanup(DbContext context) { - context.Set().RemoveRange(context.Set()); - context.Set().RemoveRange(context.Set()); + context.Set().Remove(context.Set().ToArray()); + context.Set().Remove(context.Set().ToArray()); context.SaveChanges(); } diff --git a/test/EntityFramework.FunctionalTests/OneToOneQueryFixtureBase.cs b/test/EntityFramework.FunctionalTests/OneToOneQueryFixtureBase.cs index 5ddd798379e..ad6af2a2e7c 100644 --- a/test/EntityFramework.FunctionalTests/OneToOneQueryFixtureBase.cs +++ b/test/EntityFramework.FunctionalTests/OneToOneQueryFixtureBase.cs @@ -36,7 +36,7 @@ protected static void AddTestData(DbContext context) var address2 = new Address { Street = "42 Castle Black", City = "The Wall" }; var address3 = new Address { Street = "House of Black and White", City = "Braavos" }; - context.Set().AddRange( + context.Set().Add( new[] { new Person { Name = "Daenerys Targaryen", Address = address1 }, @@ -45,7 +45,7 @@ protected static void AddTestData(DbContext context) } ); - context.Set
().AddRange( + context.Set
().Add( new[] { address1, @@ -58,7 +58,7 @@ protected static void AddTestData(DbContext context) var address22 = new Address2 { Id = "2", Street = "42 Castle Black", City = "The Wall" }; var address23 = new Address2 { Id = "3", Street = "House of Black and White", City = "Braavos" }; - context.Set().AddRange( + context.Set().Add( new[] { new Person2 { Name = "Daenerys Targaryen", Address = address21 }, @@ -67,7 +67,7 @@ protected static void AddTestData(DbContext context) } ); - context.Set().AddRange( + context.Set().Add( new[] { address21, diff --git a/test/EntityFramework.FunctionalTests/OptimisticConcurrencyTestBase.cs b/test/EntityFramework.FunctionalTests/OptimisticConcurrencyTestBase.cs index 89296726c50..9d93ecf8331 100644 --- a/test/EntityFramework.FunctionalTests/OptimisticConcurrencyTestBase.cs +++ b/test/EntityFramework.FunctionalTests/OptimisticConcurrencyTestBase.cs @@ -519,14 +519,12 @@ public virtual void Calling_Reload_on_an_Added_entity_throws() { using (var context = CreateF1Context()) { - var entry = - context.ChangeTracker.Entry( - context.Drivers.Add( - new Driver - { - Name = "Larry David", - TeamId = Team.Ferrari - })); + var entry = context.Drivers.Add( + new Driver + { + Name = "Larry David", + TeamId = Team.Ferrari + }); Assert.Equal("Can't reload an added entity", Assert.Throws(() => entry.Reload(context)).Message); @@ -538,14 +536,12 @@ public virtual void Calling_Reload_on_a_detached_entity_throws() { using (var context = CreateF1Context()) { - var entry = - context.ChangeTracker.Entry( - context.Drivers.Add( - new Driver - { - Name = "Larry David", - TeamId = Team.Ferrari - })); + var entry = context.Drivers.Add( + new Driver + { + Name = "Larry David", + TeamId = Team.Ferrari + }); entry.State = EntityState.Unknown; Assert.Equal("Can't reload an unknown entity", @@ -596,14 +592,12 @@ public virtual async Task Calling_ReloadAsync_on_an_Added_entity_throws() { using (var context = CreateF1Context()) { - var entry = - context.ChangeTracker.Entry( - context.Drivers.Add( - new Driver - { - Name = "Larry David", - TeamId = Team.Ferrari - })); + var entry = context.Drivers.Add( + new Driver + { + Name = "Larry David", + TeamId = Team.Ferrari + }); Assert.Equal("Can't reload an added entity", (await Assert.ThrowsAsync(() => entry.ReloadAsync(context))).Message); @@ -615,14 +609,12 @@ public virtual async Task Calling_ReloadAsync_on_a_detached_entity_throws() { using (var context = CreateF1Context()) { - var entry = - context.ChangeTracker.Entry( - context.Drivers.Add( - new Driver - { - Name = "Larry David", - TeamId = Team.Ferrari - })); + var entry = context.Drivers.Add( + new Driver + { + Name = "Larry David", + TeamId = Team.Ferrari + }); entry.State = EntityState.Unknown; Assert.Equal("Can't reload an unknown entity", diff --git a/test/EntityFramework.FunctionalTests/TestModels/ConcurrencyModel/ConcurrencyModelInitializer.cs b/test/EntityFramework.FunctionalTests/TestModels/ConcurrencyModel/ConcurrencyModelInitializer.cs index 841af6b9322..747b7026820 100644 --- a/test/EntityFramework.FunctionalTests/TestModels/ConcurrencyModel/ConcurrencyModelInitializer.cs +++ b/test/EntityFramework.FunctionalTests/TestModels/ConcurrencyModel/ConcurrencyModelInitializer.cs @@ -915,13 +915,13 @@ public static Task CleanupAsync(F1Context context) private static void RemoveAllEntities(F1Context context) { - context.Sponsors.RemoveRange(context.Sponsors); - context.Set().RemoveRange(context.Set()); - context.Drivers.RemoveRange(context.Drivers); - context.Set().RemoveRange(context.Set()); - context.Teams.RemoveRange(context.Teams); - context.Engines.RemoveRange(context.Engines); - context.EngineSuppliers.RemoveRange(context.EngineSuppliers); + context.Sponsors.Remove(context.Sponsors.ToArray()); + context.Set().Remove(context.Set().ToArray()); + context.Drivers.Remove(context.Drivers.ToArray()); + context.Set().Remove(context.Set().ToArray()); + context.Teams.Remove(context.Teams.ToArray()); + context.Engines.Remove(context.Engines.ToArray()); + context.EngineSuppliers.Remove(context.EngineSuppliers.ToArray()); } } } diff --git a/test/EntityFramework.FunctionalTests/TestModels/MonsterContext`.cs b/test/EntityFramework.FunctionalTests/TestModels/MonsterContext`.cs index 004ea2db584..e7a4f6c851b 100644 --- a/test/EntityFramework.FunctionalTests/TestModels/MonsterContext`.cs +++ b/test/EntityFramework.FunctionalTests/TestModels/MonsterContext`.cs @@ -415,22 +415,22 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) public override void SeedUsingFKs(bool saveChanges = true) { - var customer0 = Add(new TCustomer { Name = "Eeky Bear" }); - var customer1 = Add(new TCustomer { Name = "Sheila Koalie" }); - var customer3 = Add(new TCustomer { Name = "Tarquin Tiger" }); + var customer0 = Add(new TCustomer { Name = "Eeky Bear" }).Entity; + var customer1 = Add(new TCustomer { Name = "Sheila Koalie" }).Entity; + var customer3 = Add(new TCustomer { Name = "Tarquin Tiger" }).Entity; - var customer2 = Add(new TCustomer { Name = "Sue Pandy", HusbandId = customer0.CustomerId }); + var customer2 = Add(new TCustomer { Name = "Sue Pandy", HusbandId = customer0.CustomerId }).Entity; - var product1 = Add(new TProduct { Description = "Mrs Koalie's Famous Waffles", BaseConcurrency = "Pounds Sterling" }); - var product2 = Add(new TProduct { Description = "Chocolate Donuts", BaseConcurrency = "US Dollars" }); - var product3 = Add(new TProduct { Description = "Assorted Dog Treats", BaseConcurrency = "Stuffy Money" }); + var product1 = Add(new TProduct { Description = "Mrs Koalie's Famous Waffles", BaseConcurrency = "Pounds Sterling" }).Entity; + var product2 = Add(new TProduct { Description = "Chocolate Donuts", BaseConcurrency = "US Dollars" }).Entity; + var product3 = Add(new TProduct { Description = "Assorted Dog Treats", BaseConcurrency = "Stuffy Money" }).Entity; - var barcode1 = Add(new TBarcode { Code = new byte[] { 1, 2, 3, 4 }, ProductId = product1.ProductId, Text = "Barcode 1 2 3 4" }); - var barcode2 = Add(new TBarcode { Code = new byte[] { 2, 2, 3, 4 }, ProductId = product2.ProductId, Text = "Barcode 2 2 3 4" }); - var barcode3 = Add(new TBarcode { Code = new byte[] { 3, 2, 3, 4 }, ProductId = product3.ProductId, Text = "Barcode 3 2 3 4" }); + var barcode1 = Add(new TBarcode { Code = new byte[] { 1, 2, 3, 4 }, ProductId = product1.ProductId, Text = "Barcode 1 2 3 4" }).Entity; + var barcode2 = Add(new TBarcode { Code = new byte[] { 2, 2, 3, 4 }, ProductId = product2.ProductId, Text = "Barcode 2 2 3 4" }).Entity; + var barcode3 = Add(new TBarcode { Code = new byte[] { 3, 2, 3, 4 }, ProductId = product3.ProductId, Text = "Barcode 3 2 3 4" }).Entity; - var barcodeDetails1 = Add(new TBarcodeDetail { Code = barcode1.Code, RegisteredTo = "Eeky Bear" }); - var barcodeDetails2 = Add(new TBarcodeDetail { Code = barcode2.Code, RegisteredTo = "Trent" }); + var barcodeDetails1 = Add(new TBarcodeDetail { Code = barcode1.Code, RegisteredTo = "Eeky Bear" }).Entity; + var barcodeDetails2 = Add(new TBarcodeDetail { Code = barcode2.Code, RegisteredTo = "Trent" }).Entity; var incorrectScan1 = Add( new TIncorrectScan @@ -439,7 +439,7 @@ public override void SeedUsingFKs(bool saveChanges = true) Details = "Treats not Donuts", ActualCode = barcode3.Code, ExpectedCode = barcode2.Code - }); + }).Entity; var incorrectScan2 = Add( new TIncorrectScan @@ -448,7 +448,7 @@ public override void SeedUsingFKs(bool saveChanges = true) Details = "Wot no waffles?", ActualCode = barcode2.Code, ExpectedCode = barcode1.Code - }); + }).Entity; var complaint1 = Add(new TComplaint { @@ -456,7 +456,7 @@ public override void SeedUsingFKs(bool saveChanges = true) AlternateId = 88, Details = "Don't give coffee to Eeky!", Logged = new DateTime(2014, 5, 27, 19, 22, 26) - }); + }).Entity; var complaint2 = Add(new TComplaint { @@ -464,27 +464,27 @@ public override void SeedUsingFKs(bool saveChanges = true) AlternateId = 89, Details = "Really! Don't give coffee to Eeky!", Logged = new DateTime(2014, 5, 28, 19, 22, 26) - }); + }).Entity; var resolution = Add(new TResolution { ResolutionId = complaint2.AlternateId, Details = "Destroyed all coffee in Redmond area." - }); + }).Entity; - var login1 = Add(new TLogin { CustomerId = customer1.CustomerId, Username = "MrsKoalie73", AlternateUsername = "Sheila" }); - var login2 = Add(new TLogin { CustomerId = customer2.CustomerId, Username = "MrsBossyPants", AlternateUsername = "Sue" }); - var login3 = Add(new TLogin { CustomerId = customer3.CustomerId, Username = "TheStripedMenace", AlternateUsername = "Tarquin" }); + var login1 = Add(new TLogin { CustomerId = customer1.CustomerId, Username = "MrsKoalie73", AlternateUsername = "Sheila" }).Entity; + var login2 = Add(new TLogin { CustomerId = customer2.CustomerId, Username = "MrsBossyPants", AlternateUsername = "Sue" }).Entity; + var login3 = Add(new TLogin { CustomerId = customer3.CustomerId, Username = "TheStripedMenace", AlternateUsername = "Tarquin" }).Entity; - var suspiciousActivity1 = Add(new TSuspiciousActivity { Activity = "Pig prints on keyboard", Username = login3.Username }); - var suspiciousActivity2 = Add(new TSuspiciousActivity { Activity = "Crumbs in the cupboard", Username = login3.Username }); - var suspiciousActivity3 = Add(new TSuspiciousActivity { Activity = "Donuts gone missing", Username = login3.Username }); + var suspiciousActivity1 = Add(new TSuspiciousActivity { Activity = "Pig prints on keyboard", Username = login3.Username }).Entity; + var suspiciousActivity2 = Add(new TSuspiciousActivity { Activity = "Crumbs in the cupboard", Username = login3.Username }).Entity; + var suspiciousActivity3 = Add(new TSuspiciousActivity { Activity = "Donuts gone missing", Username = login3.Username }).Entity; - var rsaToken1 = Add(new TRsaToken { Issued = DateTime.Now, Serial = "1234", Username = login1.Username }); - var rsaToken2 = Add(new TRsaToken { Issued = DateTime.Now, Serial = "2234", Username = login2.Username }); + var rsaToken1 = Add(new TRsaToken { Issued = DateTime.Now, Serial = "1234", Username = login1.Username }).Entity; + var rsaToken2 = Add(new TRsaToken { Issued = DateTime.Now, Serial = "2234", Username = login2.Username }).Entity; - var smartCard1 = Add(new TSmartCard { Username = login1.Username, CardSerial = rsaToken1.Serial, Issued = rsaToken1.Issued }); - var smartCard2 = Add(new TSmartCard { Username = login2.Username, CardSerial = rsaToken2.Serial, Issued = rsaToken2.Issued }); + var smartCard1 = Add(new TSmartCard { Username = login1.Username, CardSerial = rsaToken1.Serial, Issued = rsaToken1.Issued }).Entity; + var smartCard2 = Add(new TSmartCard { Username = login2.Username, CardSerial = rsaToken2.Serial, Issued = rsaToken2.Issued }).Entity; var reset1 = Add(new TPasswordReset { @@ -492,11 +492,11 @@ public override void SeedUsingFKs(bool saveChanges = true) ResetNo = 1, TempPassword = "Rent-A-Mole", Username = login3.AlternateUsername - }); + }).Entity; - var pageView1 = Add(new TPageView { PageUrl = "somePage1", Username = login1.Username, Viewed = DateTime.Now }); - var pageView2 = Add(new TPageView { PageUrl = "somePage2", Username = login1.Username, Viewed = DateTime.Now }); - var pageView3 = Add(new TPageView { PageUrl = "somePage3", Username = login1.Username, Viewed = DateTime.Now }); + var pageView1 = Add(new TPageView { PageUrl = "somePage1", Username = login1.Username, Viewed = DateTime.Now }).Entity; + var pageView2 = Add(new TPageView { PageUrl = "somePage2", Username = login1.Username, Viewed = DateTime.Now }).Entity; + var pageView3 = Add(new TPageView { PageUrl = "somePage3", Username = login1.Username, Viewed = DateTime.Now }).Entity; var lastLogin1 = Add(new TLastLogin { @@ -504,7 +504,7 @@ public override void SeedUsingFKs(bool saveChanges = true) LoggedOut = new DateTime(2014, 5, 27, 11, 22, 26), Username = login1.Username, SmartcardUsername = smartCard1.Username - }); + }).Entity; var lastLogin2 = Add(new TLastLogin { @@ -512,7 +512,7 @@ public override void SeedUsingFKs(bool saveChanges = true) LoggedOut = new DateTime(2014, 5, 27, 13, 22, 26), Username = login2.Username, SmartcardUsername = smartCard2.Username - }); + }).Entity; var message1 = Add(new TMessage { @@ -521,7 +521,7 @@ public override void SeedUsingFKs(bool saveChanges = true) FromUsername = login1.Username, ToUsername = login2.Username, Sent = DateTime.Now, - }); + }).Entity; var message2 = Add(new TMessage { @@ -530,7 +530,7 @@ public override void SeedUsingFKs(bool saveChanges = true) FromUsername = login2.Username, ToUsername = login1.Username, Sent = DateTime.Now, - }); + }).Entity; var message3 = Add(new TMessage { @@ -539,37 +539,37 @@ public override void SeedUsingFKs(bool saveChanges = true) FromUsername = login1.Username, ToUsername = login2.Username, Sent = DateTime.Now, - }); + }).Entity; - var order1 = Add(new TAnOrder { CustomerId = customer1.CustomerId, Username = login1.Username, AlternateId = 77 }); - var order2 = Add(new TAnOrder { CustomerId = customer2.CustomerId, Username = login2.Username, AlternateId = 78 }); - var order3 = Add(new TAnOrder { CustomerId = customer3.CustomerId, Username = login3.Username, AlternateId = 79 }); + var order1 = Add(new TAnOrder { CustomerId = customer1.CustomerId, Username = login1.Username, AlternateId = 77 }).Entity; + var order2 = Add(new TAnOrder { CustomerId = customer2.CustomerId, Username = login2.Username, AlternateId = 78 }).Entity; + var order3 = Add(new TAnOrder { CustomerId = customer3.CustomerId, Username = login3.Username, AlternateId = 79 }).Entity; - var orderNote1 = Add(new TOrderNote { Note = "Must have tea!", OrderId = order1.AlternateId }); - var orderNote2 = Add(new TOrderNote { Note = "And donuts!", OrderId = order1.AlternateId }); - var orderNote3 = Add(new TOrderNote { Note = "But no coffee. :-(", OrderId = order1.AlternateId }); + var orderNote1 = Add(new TOrderNote { Note = "Must have tea!", OrderId = order1.AlternateId }).Entity; + var orderNote2 = Add(new TOrderNote { Note = "And donuts!", OrderId = order1.AlternateId }).Entity; + var orderNote3 = Add(new TOrderNote { Note = "But no coffee. :-(", OrderId = order1.AlternateId }).Entity; - var orderQualityCheck1 = Add(new TOrderQualityCheck { OrderId = order1.AlternateId, CheckedBy = "Eeky Bear" }); - var orderQualityCheck2 = Add(new TOrderQualityCheck { OrderId = order2.AlternateId, CheckedBy = "Eeky Bear" }); - var orderQualityCheck3 = Add(new TOrderQualityCheck { OrderId = order3.AlternateId, CheckedBy = "Eeky Bear" }); + var orderQualityCheck1 = Add(new TOrderQualityCheck { OrderId = order1.AlternateId, CheckedBy = "Eeky Bear" }).Entity; + var orderQualityCheck2 = Add(new TOrderQualityCheck { OrderId = order2.AlternateId, CheckedBy = "Eeky Bear" }).Entity; + var orderQualityCheck3 = Add(new TOrderQualityCheck { OrderId = order3.AlternateId, CheckedBy = "Eeky Bear" }).Entity; - var orderLine1 = Add(new TOrderLine { OrderId = order1.AnOrderId, ProductId = product1.ProductId, Quantity = 7 }); - var orderLine2 = Add(new TOrderLine { OrderId = order1.AnOrderId, ProductId = product2.ProductId, Quantity = 1 }); - var orderLine3 = Add(new TOrderLine { OrderId = order2.AnOrderId, ProductId = product3.ProductId, Quantity = 2 }); - var orderLine4 = Add(new TOrderLine { OrderId = order2.AnOrderId, ProductId = product2.ProductId, Quantity = 3 }); - var orderLine5 = Add(new TOrderLine { OrderId = order2.AnOrderId, ProductId = product1.ProductId, Quantity = 4 }); - var orderLine6 = Add(new TOrderLine { OrderId = order3.AnOrderId, ProductId = product2.ProductId, Quantity = 5 }); + var orderLine1 = Add(new TOrderLine { OrderId = order1.AnOrderId, ProductId = product1.ProductId, Quantity = 7 }).Entity; + var orderLine2 = Add(new TOrderLine { OrderId = order1.AnOrderId, ProductId = product2.ProductId, Quantity = 1 }).Entity; + var orderLine3 = Add(new TOrderLine { OrderId = order2.AnOrderId, ProductId = product3.ProductId, Quantity = 2 }).Entity; + var orderLine4 = Add(new TOrderLine { OrderId = order2.AnOrderId, ProductId = product2.ProductId, Quantity = 3 }).Entity; + var orderLine5 = Add(new TOrderLine { OrderId = order2.AnOrderId, ProductId = product1.ProductId, Quantity = 4 }).Entity; + var orderLine6 = Add(new TOrderLine { OrderId = order3.AnOrderId, ProductId = product2.ProductId, Quantity = 5 }).Entity; - var productDetail1 = Add(new TProductDetail { Details = "A Waffle Cart specialty!", ProductId = product1.ProductId }); - var productDetail2 = Add(new TProductDetail { Details = "Eeky Bear's favorite!", ProductId = product2.ProductId }); + var productDetail1 = Add(new TProductDetail { Details = "A Waffle Cart specialty!", ProductId = product1.ProductId }).Entity; + var productDetail2 = Add(new TProductDetail { Details = "Eeky Bear's favorite!", ProductId = product2.ProductId }).Entity; - var productReview1 = Add(new TProductReview { ProductId = product1.ProductId, Review = "Better than Tarqies!" }); - var productReview2 = Add(new TProductReview { ProductId = product1.ProductId, Review = "Good with maple syrup." }); - var productReview3 = Add(new TProductReview { ProductId = product2.ProductId, Review = "Eeky says yes!" }); + var productReview1 = Add(new TProductReview { ProductId = product1.ProductId, Review = "Better than Tarqies!" }).Entity; + var productReview2 = Add(new TProductReview { ProductId = product1.ProductId, Review = "Good with maple syrup." }).Entity; + var productReview3 = Add(new TProductReview { ProductId = product2.ProductId, Review = "Eeky says yes!" }).Entity; - var productPhoto1 = Add(new TProductPhoto { ProductId = product1.ProductId, Photo = new byte[] { 101, 102 } }); - var productPhoto2 = Add(new TProductPhoto { ProductId = product1.ProductId, Photo = new byte[] { 103, 104 } }); - var productPhoto3 = Add(new TProductPhoto { ProductId = product3.ProductId, Photo = new byte[] { 105, 106 } }); + var productPhoto1 = Add(new TProductPhoto { ProductId = product1.ProductId, Photo = new byte[] { 101, 102 } }).Entity; + var productPhoto2 = Add(new TProductPhoto { ProductId = product1.ProductId, Photo = new byte[] { 103, 104 } }).Entity; + var productPhoto3 = Add(new TProductPhoto { ProductId = product3.ProductId, Photo = new byte[] { 105, 106 } }).Entity; var productWebFeature1 = Add(new TProductWebFeature { @@ -577,29 +577,29 @@ public override void SeedUsingFKs(bool saveChanges = true) PhotoId = productPhoto1.PhotoId, ProductId = product1.ProductId, ReviewId = productReview1.ReviewId - }); + }).Entity; var productWebFeature2 = Add(new TProductWebFeature { Heading = "What does the waffle say?", ProductId = product2.ProductId, ReviewId = productReview3.ReviewId - }); + }).Entity; - var supplier1 = Add(new TSupplier { Name = "Trading As Trent" }); - var supplier2 = Add(new TSupplier { Name = "Ants By Boris" }); + var supplier1 = Add(new TSupplier { Name = "Trading As Trent" }).Entity; + var supplier2 = Add(new TSupplier { Name = "Ants By Boris" }).Entity; - var supplierLogo1 = Add(new TSupplierLogo { SupplierId = supplier1.SupplierId, Logo = new byte[] { 201, 202 } }); + var supplierLogo1 = Add(new TSupplierLogo { SupplierId = supplier1.SupplierId, Logo = new byte[] { 201, 202 } }).Entity; - var supplierInfo1 = Add(new TSupplierInfo { SupplierId = supplier1.SupplierId, Information = "Seems a bit dodgy." }); - var supplierInfo2 = Add(new TSupplierInfo { SupplierId = supplier1.SupplierId, Information = "Orange fur?" }); - var supplierInfo3 = Add(new TSupplierInfo { SupplierId = supplier2.SupplierId, Information = "Very expensive!" }); + var supplierInfo1 = Add(new TSupplierInfo { SupplierId = supplier1.SupplierId, Information = "Seems a bit dodgy." }).Entity; + var supplierInfo2 = Add(new TSupplierInfo { SupplierId = supplier1.SupplierId, Information = "Orange fur?" }).Entity; + var supplierInfo3 = Add(new TSupplierInfo { SupplierId = supplier2.SupplierId, Information = "Very expensive!" }).Entity; - var customerInfo1 = Add(new TCustomerInfo { CustomerInfoId = customer1.CustomerId, Information = "Really likes tea." }); - var customerInfo2 = Add(new TCustomerInfo { CustomerInfoId = customer2.CustomerId, Information = "Mrs Bossy Pants!" }); + var customerInfo1 = Add(new TCustomerInfo { CustomerInfoId = customer1.CustomerId, Information = "Really likes tea." }).Entity; + var customerInfo2 = Add(new TCustomerInfo { CustomerInfoId = customer2.CustomerId, Information = "Mrs Bossy Pants!" }).Entity; - var computer1 = Add(new TComputer { Name = "markash420" }); - var computer2 = Add(new TComputer { Name = "unicorns420" }); + var computer1 = Add(new TComputer { Name = "markash420" }).Entity; + var computer2 = Add(new TComputer { Name = "unicorns420" }).Entity; var computerDetail1 = Add(new TComputerDetail { @@ -609,7 +609,7 @@ public override void SeedUsingFKs(bool saveChanges = true) PurchaseDate = new DateTime(2008, 4, 1), Serial = "4201", Specifications = "It's a Dell!" - }); + }).Entity; var computerDetail2 = Add(new TComputerDetail { @@ -619,10 +619,10 @@ public override void SeedUsingFKs(bool saveChanges = true) PurchaseDate = new DateTime(2012, 4, 1), Serial = "4202", Specifications = "It's not a Dell!" - }); + }).Entity; - var driver1 = Add(new TDriver { BirthDate = new DateTime(2006, 9, 19), Name = "Eeky Bear" }); - var driver2 = Add(new TDriver { BirthDate = new DateTime(2007, 9, 19), Name = "Splash Bear" }); + var driver1 = Add(new TDriver { BirthDate = new DateTime(2006, 9, 19), Name = "Eeky Bear" }).Entity; + var driver2 = Add(new TDriver { BirthDate = new DateTime(2007, 9, 19), Name = "Splash Bear" }).Entity; var license1 = Add(new TLicense { @@ -632,7 +632,7 @@ public override void SeedUsingFKs(bool saveChanges = true) Restrictions = "None", State = LicenseState.Active, ExpirationDate = new DateTime(2018, 9, 19) - }); + }).Entity; var license2 = Add(new TLicense { @@ -642,7 +642,7 @@ public override void SeedUsingFKs(bool saveChanges = true) Restrictions = "None", State = LicenseState.Revoked, ExpirationDate = new DateTime(2018, 9, 19) - }); + }).Entity; if (saveChanges) { @@ -652,23 +652,23 @@ public override void SeedUsingFKs(bool saveChanges = true) public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs, bool saveChanges = true) { - var customer0 = Add(new TCustomer { Name = "Eeky Bear" }); - var customer1 = Add(new TCustomer { Name = "Sheila Koalie" }); - var customer3 = Add(new TCustomer { Name = "Tarquin Tiger" }); + var customer0 = Add(new TCustomer { Name = "Eeky Bear" }).Entity; + var customer1 = Add(new TCustomer { Name = "Sheila Koalie" }).Entity; + var customer3 = Add(new TCustomer { Name = "Tarquin Tiger" }).Entity; - var customer2 = Add(new TCustomer { Name = "Sue Pandy", Husband = dependentNavs ? customer0 : null }); + var customer2 = Add(new TCustomer { Name = "Sue Pandy", Husband = dependentNavs ? customer0 : null }).Entity; if (principalNavs) { customer0.Wife = customer2; } - var product1 = Add(new TProduct { Description = "Mrs Koalie's Famous Waffles", BaseConcurrency = "Pounds Sterling" }); - var product2 = Add(new TProduct { Description = "Chocolate Donuts", BaseConcurrency = "US Dollars" }); - var product3 = Add(new TProduct { Description = "Assorted Dog Treats", BaseConcurrency = "Stuffy Money" }); + var product1 = Add(new TProduct { Description = "Mrs Koalie's Famous Waffles", BaseConcurrency = "Pounds Sterling" }).Entity; + var product2 = Add(new TProduct { Description = "Chocolate Donuts", BaseConcurrency = "US Dollars" }).Entity; + var product3 = Add(new TProduct { Description = "Assorted Dog Treats", BaseConcurrency = "Stuffy Money" }).Entity; - var barcode1 = Add(new TBarcode { Code = new byte[] { 1, 2, 3, 4 }, Product = dependentNavs ? product1 : null, Text = "Barcode 1 2 3 4" }); - var barcode2 = Add(new TBarcode { Code = new byte[] { 2, 2, 3, 4 }, Product = dependentNavs ? product2 : null, Text = "Barcode 2 2 3 4" }); - var barcode3 = Add(new TBarcode { Code = new byte[] { 3, 2, 3, 4 }, Product = dependentNavs ? product3 : null, Text = "Barcode 3 2 3 4" }); + var barcode1 = Add(new TBarcode { Code = new byte[] { 1, 2, 3, 4 }, Product = dependentNavs ? product1 : null, Text = "Barcode 1 2 3 4" }).Entity; + var barcode2 = Add(new TBarcode { Code = new byte[] { 2, 2, 3, 4 }, Product = dependentNavs ? product2 : null, Text = "Barcode 2 2 3 4" }).Entity; + var barcode3 = Add(new TBarcode { Code = new byte[] { 3, 2, 3, 4 }, Product = dependentNavs ? product3 : null, Text = "Barcode 3 2 3 4" }).Entity; if (principalNavs) { product1.InitializeCollections(); @@ -679,8 +679,8 @@ public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs product3.Barcodes.Add(barcode3); } - var barcodeDetails1 = Add(new TBarcodeDetail { Code = barcode1.Code, RegisteredTo = "Eeky Bear" }); - var barcodeDetails2 = Add(new TBarcodeDetail { Code = barcode2.Code, RegisteredTo = "Trent" }); + var barcodeDetails1 = Add(new TBarcodeDetail { Code = barcode1.Code, RegisteredTo = "Eeky Bear" }).Entity; + var barcodeDetails2 = Add(new TBarcodeDetail { Code = barcode2.Code, RegisteredTo = "Trent" }).Entity; if (principalNavs) { barcode1.Detail = barcodeDetails1; @@ -694,7 +694,7 @@ public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs Details = "Treats not Donuts", ActualBarcode = barcode3, ExpectedBarcode = dependentNavs ? barcode2 : null - }); + }).Entity; if (principalNavs) { barcode2.InitializeCollections(); @@ -708,7 +708,7 @@ public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs Details = "Wot no waffles?", ActualBarcode = barcode2, ExpectedBarcode = dependentNavs ? barcode1 : null - }); + }).Entity; if (principalNavs) { barcode1.InitializeCollections(); @@ -721,7 +721,7 @@ public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs AlternateId = 88, Details = "Don't give coffee to Eeky!", Logged = new DateTime(2014, 5, 27, 19, 22, 26) - }); + }).Entity; var complaint2 = Add(new TComplaint { @@ -729,17 +729,17 @@ public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs AlternateId = 89, Details = "Really! Don't give coffee to Eeky!", Logged = new DateTime(2014, 5, 28, 19, 22, 26) - }); + }).Entity; - var resolution = Add(new TResolution { Complaint = dependentNavs ? complaint2 : null, Details = "Destroyed all coffee in Redmond area." }); + var resolution = Add(new TResolution { Complaint = dependentNavs ? complaint2 : null, Details = "Destroyed all coffee in Redmond area." }).Entity; if (principalNavs) { complaint2.Resolution = resolution; } - var login1 = Add(new TLogin { Customer = dependentNavs ? customer1 : null, Username = "MrsKoalie73", AlternateUsername = "Sheila" }); - var login2 = Add(new TLogin { Customer = dependentNavs ? customer2 : null, Username = "MrsBossyPants", AlternateUsername = "Sue" }); - var login3 = Add(new TLogin { Customer = dependentNavs ? customer3 : null, Username = "TheStripedMenace", AlternateUsername = "Tarquin" }); + var login1 = Add(new TLogin { Customer = dependentNavs ? customer1 : null, Username = "MrsKoalie73", AlternateUsername = "Sheila" }).Entity; + var login2 = Add(new TLogin { Customer = dependentNavs ? customer2 : null, Username = "MrsBossyPants", AlternateUsername = "Sue" }).Entity; + var login3 = Add(new TLogin { Customer = dependentNavs ? customer3 : null, Username = "TheStripedMenace", AlternateUsername = "Tarquin" }).Entity; if (principalNavs) { customer1.InitializeCollections(); @@ -750,15 +750,15 @@ public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs customer3.Logins.Add(login3); } - var suspiciousActivity1 = Add(new TSuspiciousActivity { Activity = "Pig prints on keyboard", Username = login3.Username }); - var suspiciousActivity2 = Add(new TSuspiciousActivity { Activity = "Crumbs in the cupboard", Username = login3.Username }); - var suspiciousActivity3 = Add(new TSuspiciousActivity { Activity = "Donuts gone missing", Username = login3.Username }); + var suspiciousActivity1 = Add(new TSuspiciousActivity { Activity = "Pig prints on keyboard", Username = login3.Username }).Entity; + var suspiciousActivity2 = Add(new TSuspiciousActivity { Activity = "Crumbs in the cupboard", Username = login3.Username }).Entity; + var suspiciousActivity3 = Add(new TSuspiciousActivity { Activity = "Donuts gone missing", Username = login3.Username }).Entity; - var rsaToken1 = Add(new TRsaToken { Issued = DateTime.Now, Serial = "1234", Login = login1 }); - var rsaToken2 = Add(new TRsaToken { Issued = DateTime.Now, Serial = "2234", Login = login2 }); + var rsaToken1 = Add(new TRsaToken { Issued = DateTime.Now, Serial = "1234", Login = login1 }).Entity; + var rsaToken2 = Add(new TRsaToken { Issued = DateTime.Now, Serial = "2234", Login = login2 }).Entity; - var smartCard1 = Add(new TSmartCard { Login = login1, CardSerial = rsaToken1.Serial, Issued = rsaToken1.Issued }); - var smartCard2 = Add(new TSmartCard { Login = login2, CardSerial = rsaToken2.Serial, Issued = rsaToken2.Issued }); + var smartCard1 = Add(new TSmartCard { Login = login1, CardSerial = rsaToken1.Serial, Issued = rsaToken1.Issued }).Entity; + var smartCard2 = Add(new TSmartCard { Login = login2, CardSerial = rsaToken2.Serial, Issued = rsaToken2.Issued }).Entity; var reset1 = Add(new TPasswordReset { @@ -766,11 +766,11 @@ public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs ResetNo = 1, TempPassword = "Rent-A-Mole", Login = login3 - }); + }).Entity; - var pageView1 = Add(new TPageView { PageUrl = "somePage1", Login = login1, Viewed = DateTime.Now }); - var pageView2 = Add(new TPageView { PageUrl = "somePage2", Login = login1, Viewed = DateTime.Now }); - var pageView3 = Add(new TPageView { PageUrl = "somePage3", Login = login1, Viewed = DateTime.Now }); + var pageView1 = Add(new TPageView { PageUrl = "somePage1", Login = login1, Viewed = DateTime.Now }).Entity; + var pageView2 = Add(new TPageView { PageUrl = "somePage2", Login = login1, Viewed = DateTime.Now }).Entity; + var pageView3 = Add(new TPageView { PageUrl = "somePage3", Login = login1, Viewed = DateTime.Now }).Entity; var lastLogin1 = Add(new TLastLogin { @@ -778,7 +778,7 @@ public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs LoggedOut = new DateTime(2014, 5, 27, 11, 22, 26), Login = login1, SmartcardUsername = smartCard1.Username - }); + }).Entity; if (principalNavs) { login1.LastLogin = lastLogin1; @@ -791,7 +791,7 @@ public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs LoggedOut = new DateTime(2014, 5, 27, 13, 22, 26), Login = login2, SmartcardUsername = smartCard2.Username - }); + }).Entity; if (principalNavs) { login2.LastLogin = lastLogin2; @@ -805,7 +805,7 @@ public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs Sender = login1, Recipient = dependentNavs ? login2 : null, Sent = DateTime.Now, - }); + }).Entity; if (principalNavs) { login1.InitializeCollections(); @@ -821,7 +821,7 @@ public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs Sender = login2, Recipient = dependentNavs ? login1 : null, Sent = DateTime.Now, - }); + }).Entity; if (principalNavs) { login2.SentMessages.Add(message2); @@ -835,16 +835,16 @@ public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs Sender = login1, Recipient = dependentNavs ? login2 : null, Sent = DateTime.Now, - }); + }).Entity; if (principalNavs) { login1.SentMessages.Add(message3); login2.ReceivedMessages.Add(message3); } - var order1 = Add(new TAnOrder { Customer = dependentNavs ? customer1 : null, Login = dependentNavs ? login1 : null, AlternateId = 77 }); - var order2 = Add(new TAnOrder { Customer = dependentNavs ? customer2 : null, Login = dependentNavs ? login2 : null, AlternateId = 78 }); - var order3 = Add(new TAnOrder { Customer = dependentNavs ? customer3 : null, Login = dependentNavs ? login3 : null, AlternateId = 79 }); + var order1 = Add(new TAnOrder { Customer = dependentNavs ? customer1 : null, Login = dependentNavs ? login1 : null, AlternateId = 77 }).Entity; + var order2 = Add(new TAnOrder { Customer = dependentNavs ? customer2 : null, Login = dependentNavs ? login2 : null, AlternateId = 78 }).Entity; + var order3 = Add(new TAnOrder { Customer = dependentNavs ? customer3 : null, Login = dependentNavs ? login3 : null, AlternateId = 79 }).Entity; if (principalNavs) { customer1.Orders.Add(order1); @@ -856,9 +856,9 @@ public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs login3.Orders.Add(order3); } - var orderNote1 = Add(new TOrderNote { Note = "Must have tea!", Order = dependentNavs ? order1 : null }); - var orderNote2 = Add(new TOrderNote { Note = "And donuts!", Order = dependentNavs ? order1 : null }); - var orderNote3 = Add(new TOrderNote { Note = "But no coffee. :-(", Order = dependentNavs ? order1 : null }); + var orderNote1 = Add(new TOrderNote { Note = "Must have tea!", Order = dependentNavs ? order1 : null }).Entity; + var orderNote2 = Add(new TOrderNote { Note = "And donuts!", Order = dependentNavs ? order1 : null }).Entity; + var orderNote3 = Add(new TOrderNote { Note = "But no coffee. :-(", Order = dependentNavs ? order1 : null }).Entity; if (principalNavs) { order1.InitializeCollections(); @@ -867,16 +867,16 @@ public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs order1.Notes.Add(orderNote3); } - var orderQualityCheck1 = Add(new TOrderQualityCheck { Order = order1, CheckedBy = "Eeky Bear" }); - var orderQualityCheck2 = Add(new TOrderQualityCheck { Order = order2, CheckedBy = "Eeky Bear" }); - var orderQualityCheck3 = Add(new TOrderQualityCheck { Order = order3, CheckedBy = "Eeky Bear" }); + var orderQualityCheck1 = Add(new TOrderQualityCheck { Order = order1, CheckedBy = "Eeky Bear" }).Entity; + var orderQualityCheck2 = Add(new TOrderQualityCheck { Order = order2, CheckedBy = "Eeky Bear" }).Entity; + var orderQualityCheck3 = Add(new TOrderQualityCheck { Order = order3, CheckedBy = "Eeky Bear" }).Entity; - var orderLine1 = Add(new TOrderLine { Order = order1, Product = product1, Quantity = 7 }); - var orderLine2 = Add(new TOrderLine { Order = order1, Product = product2, Quantity = 1 }); - var orderLine3 = Add(new TOrderLine { Order = order2, Product = product3, Quantity = 2 }); - var orderLine4 = Add(new TOrderLine { Order = order2, Product = product2, Quantity = 3 }); - var orderLine5 = Add(new TOrderLine { Order = order2, Product = product1, Quantity = 4 }); - var orderLine6 = Add(new TOrderLine { Order = order3, Product = product2, Quantity = 5 }); + var orderLine1 = Add(new TOrderLine { Order = order1, Product = product1, Quantity = 7 }).Entity; + var orderLine2 = Add(new TOrderLine { Order = order1, Product = product2, Quantity = 1 }).Entity; + var orderLine3 = Add(new TOrderLine { Order = order2, Product = product3, Quantity = 2 }).Entity; + var orderLine4 = Add(new TOrderLine { Order = order2, Product = product2, Quantity = 3 }).Entity; + var orderLine5 = Add(new TOrderLine { Order = order2, Product = product1, Quantity = 4 }).Entity; + var orderLine6 = Add(new TOrderLine { Order = order3, Product = product2, Quantity = 5 }).Entity; if (principalNavs) { order1.OrderLines.Add(orderLine1); @@ -889,17 +889,17 @@ public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs order3.OrderLines.Add(orderLine6); } - var productDetail1 = Add(new TProductDetail { Details = "A Waffle Cart specialty!", Product = product1 }); - var productDetail2 = Add(new TProductDetail { Details = "Eeky Bear's favorite!", Product = product2 }); + var productDetail1 = Add(new TProductDetail { Details = "A Waffle Cart specialty!", Product = product1 }).Entity; + var productDetail2 = Add(new TProductDetail { Details = "Eeky Bear's favorite!", Product = product2 }).Entity; if (principalNavs) { product1.Detail = productDetail1; product2.Detail = productDetail2; } - var productReview1 = Add(new TProductReview { Product = dependentNavs ? product1 : null, Review = "Better than Tarqies!" }); - var productReview2 = Add(new TProductReview { Product = dependentNavs ? product1 : null, Review = "Good with maple syrup." }); - var productReview3 = Add(new TProductReview { Product = dependentNavs ? product2 : null, Review = "Eeky says yes!" }); + var productReview1 = Add(new TProductReview { Product = dependentNavs ? product1 : null, Review = "Better than Tarqies!" }).Entity; + var productReview2 = Add(new TProductReview { Product = dependentNavs ? product1 : null, Review = "Good with maple syrup." }).Entity; + var productReview3 = Add(new TProductReview { Product = dependentNavs ? product2 : null, Review = "Eeky says yes!" }).Entity; if (principalNavs) { product1.Reviews.Add(productReview1); @@ -907,9 +907,9 @@ public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs product2.Reviews.Add(productReview3); } - var productPhoto1 = Add(new TProductPhoto { ProductId = product1.ProductId, Photo = new byte[] { 101, 102 } }); - var productPhoto2 = Add(new TProductPhoto { ProductId = product1.ProductId, Photo = new byte[] { 103, 104 } }); - var productPhoto3 = Add(new TProductPhoto { ProductId = product3.ProductId, Photo = new byte[] { 105, 106 } }); + var productPhoto1 = Add(new TProductPhoto { ProductId = product1.ProductId, Photo = new byte[] { 101, 102 } }).Entity; + var productPhoto2 = Add(new TProductPhoto { ProductId = product1.ProductId, Photo = new byte[] { 103, 104 } }).Entity; + var productPhoto3 = Add(new TProductPhoto { ProductId = product3.ProductId, Photo = new byte[] { 105, 106 } }).Entity; if (principalNavs) { product1.Photos.Add(productPhoto1); @@ -923,7 +923,7 @@ public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs Photo = dependentNavs ? productPhoto1 : null, ProductId = product1.ProductId, Review = dependentNavs ? productReview1 : null - }); + }).Entity; if (principalNavs) { productPhoto1.InitializeCollections(); @@ -937,36 +937,36 @@ public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs Heading = "What does the waffle say?", ProductId = product2.ProductId, Review = dependentNavs ? productReview3 : null - }); + }).Entity; if (principalNavs) { productReview3.InitializeCollections(); productReview3.Features.Add(productWebFeature2); } - var supplier1 = Add(new TSupplier { Name = "Trading As Trent" }); - var supplier2 = Add(new TSupplier { Name = "Ants By Boris" }); + var supplier1 = Add(new TSupplier { Name = "Trading As Trent" }).Entity; + var supplier2 = Add(new TSupplier { Name = "Ants By Boris" }).Entity; - var supplierLogo1 = Add(new TSupplierLogo { SupplierId = !principalNavs ? supplier1.SupplierId : 0, Logo = new byte[] { 201, 202 } }); + var supplierLogo1 = Add(new TSupplierLogo { SupplierId = !principalNavs ? supplier1.SupplierId : 0, Logo = new byte[] { 201, 202 } }).Entity; if (principalNavs) { supplier1.Logo = supplierLogo1; } - var supplierInfo1 = Add(new TSupplierInfo { Supplier = supplier1, Information = "Seems a bit dodgy." }); - var supplierInfo2 = Add(new TSupplierInfo { Supplier = supplier1, Information = "Orange fur?" }); - var supplierInfo3 = Add(new TSupplierInfo { Supplier = supplier2, Information = "Very expensive!" }); + var supplierInfo1 = Add(new TSupplierInfo { Supplier = supplier1, Information = "Seems a bit dodgy." }).Entity; + var supplierInfo2 = Add(new TSupplierInfo { Supplier = supplier1, Information = "Orange fur?" }).Entity; + var supplierInfo3 = Add(new TSupplierInfo { Supplier = supplier2, Information = "Very expensive!" }).Entity; - var customerInfo1 = Add(new TCustomerInfo { CustomerInfoId = customer1.CustomerId, Information = "Really likes tea." }); - var customerInfo2 = Add(new TCustomerInfo { CustomerInfoId = customer2.CustomerId, Information = "Mrs Bossy Pants!" }); + var customerInfo1 = Add(new TCustomerInfo { CustomerInfoId = customer1.CustomerId, Information = "Really likes tea." }).Entity; + var customerInfo2 = Add(new TCustomerInfo { CustomerInfoId = customer2.CustomerId, Information = "Mrs Bossy Pants!" }).Entity; if (principalNavs) { customer1.Info = customerInfo1; customer2.Info = customerInfo2; } - var computer1 = Add(new TComputer { Name = "markash420" }); - var computer2 = Add(new TComputer { Name = "unicorns420" }); + var computer1 = Add(new TComputer { Name = "markash420" }).Entity; + var computer2 = Add(new TComputer { Name = "unicorns420" }).Entity; var computerDetail1 = Add(new TComputerDetail { @@ -976,7 +976,7 @@ public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs PurchaseDate = new DateTime(2008, 4, 1), Serial = "4201", Specifications = "It's a Dell!" - }); + }).Entity; if (principalNavs) { computer1.ComputerDetail = computerDetail1; @@ -990,14 +990,14 @@ public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs PurchaseDate = new DateTime(2012, 4, 1), Serial = "4202", Specifications = "It's not a Dell!" - }); + }).Entity; if (principalNavs) { computer2.ComputerDetail = computerDetail2; } - var driver1 = Add(new TDriver { BirthDate = new DateTime(2006, 9, 19), Name = "Eeky Bear" }); - var driver2 = Add(new TDriver { BirthDate = new DateTime(2007, 9, 19), Name = "Splash Bear" }); + var driver1 = Add(new TDriver { BirthDate = new DateTime(2006, 9, 19), Name = "Eeky Bear" }).Entity; + var driver2 = Add(new TDriver { BirthDate = new DateTime(2007, 9, 19), Name = "Splash Bear" }).Entity; var license1 = Add(new TLicense { @@ -1007,7 +1007,7 @@ public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs Restrictions = "None", State = LicenseState.Active, ExpirationDate = new DateTime(2018, 9, 19) - }); + }).Entity; if (principalNavs) { driver1.License = license1; @@ -1021,7 +1021,7 @@ public override void SeedUsingNavigations(bool dependentNavs, bool principalNavs Restrictions = "None", State = LicenseState.Revoked, ExpirationDate = new DateTime(2018, 9, 19) - }); + }).Entity; if (principalNavs) { driver2.License = license2; diff --git a/test/EntityFramework.FunctionalTests/TestModels/Northwind/NorthwindData.cs b/test/EntityFramework.FunctionalTests/TestModels/Northwind/NorthwindData.cs index e92694dee14..a44583411c1 100644 --- a/test/EntityFramework.FunctionalTests/TestModels/Northwind/NorthwindData.cs +++ b/test/EntityFramework.FunctionalTests/TestModels/Northwind/NorthwindData.cs @@ -2,15 +2,15 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; using System.Globalization; using System.Linq; -using Microsoft.Data.Entity.Query; -using System.Collections.Generic; using System.Linq.Expressions; -using System.Threading.Tasks; using System.Threading; -using Remotion.Linq.Parsing; +using System.Threading.Tasks; using System.Reflection; +using Microsoft.Data.Entity.Query; +using Remotion.Linq.Parsing; namespace Microsoft.Data.Entity.FunctionalTests.TestModels.Northwind { @@ -48,7 +48,7 @@ public static IQueryable Set() public static void Seed(NorthwindContext context) { - context.Set().AddRange(CreateCustomers()); + context.Set().Add(CreateCustomers()); var titleProperty = context.Model.GetEntityType(typeof(Employee)).GetProperty("Title"); foreach (var employee in NorthwindData.CreateEmployees()) @@ -57,9 +57,9 @@ public static void Seed(NorthwindContext context) context.ChangeTracker.Entry(employee).StateEntry[titleProperty] = employee.Title; } - context.Set().AddRange(CreateOrders()); - context.Set().AddRange(CreateProducts()); - context.Set().AddRange(CreateOrderDetails()); + context.Set().Add(CreateOrders()); + context.Set().Add(CreateProducts()); + context.Set().Add(CreateOrderDetails()); context.SaveChanges(); } @@ -80,11 +80,11 @@ public static Task CleanupAsync(NorthwindContext context) private static void RemoveAllEntities(NorthwindContext context) { - context.Set().RemoveRange(context.Set()); - context.Set().RemoveRange(context.Set()); - context.Set().RemoveRange(context.Set()); - context.Set().RemoveRange(context.Set()); - context.Set().RemoveRange(context.Set()); + context.Set().Remove(context.Set().ToArray()); + context.Set().Remove(context.Set().ToArray()); + context.Set().Remove(context.Set().ToArray()); + context.Set().Remove(context.Set().ToArray()); + context.Set().Remove(context.Set().ToArray()); } private class AsyncEnumerable : EnumerableQuery, IAsyncQueryProvider diff --git a/test/EntityFramework.InMemory.FunctionalTests/CompositeKeyEndToEndTest.cs b/test/EntityFramework.InMemory.FunctionalTests/CompositeKeyEndToEndTest.cs index a33795195ba..a4f98484ee3 100644 --- a/test/EntityFramework.InMemory.FunctionalTests/CompositeKeyEndToEndTest.cs +++ b/test/EntityFramework.InMemory.FunctionalTests/CompositeKeyEndToEndTest.cs @@ -72,7 +72,7 @@ public async Task Can_use_generated_values_in_composite_key_end_to_end() using (var context = new BronieContext(serviceProvider)) { - var added = await context.AddAsync(new Unicorn { Id2 = id2, Name = "Rarity" }); + var added = (await context.AddAsync(new Unicorn { Id2 = id2, Name = "Rarity" })).Entity; Assert.True(added.Id1 > 0); Assert.NotEqual(Guid.Empty, added.Id3); @@ -127,9 +127,9 @@ public async Task Only_one_part_of_a_composite_key_needs_to_vary_for_uniquness() 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" }); + var pony1 = (await context.AddAsync(new EarthPony { Id2 = 7, Name = "Apple Jack 1" })).Entity; + var pony2 = (await context.AddAsync(new EarthPony { Id2 = 7, Name = "Apple Jack 2" })).Entity; + var pony3 = (await context.AddAsync(new EarthPony { Id2 = 7, Name = "Apple Jack 3" })).Entity; await context.SaveChangesAsync(); @@ -154,14 +154,14 @@ public async Task Only_one_part_of_a_composite_key_needs_to_vary_for_uniquness() using (var context = new BronieContext(serviceProvider)) { - var ponies = context.EarthPonies.ToList(); - Assert.Equal(ponies.Count, ponies.Count(e => e.Name == "Apple Jack 1") * 3); + 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); + context.EarthPonies.Remove(ponies); await context.SaveChangesAsync(); } diff --git a/test/EntityFramework.InMemory.FunctionalTests/EntityTypeTest.cs b/test/EntityFramework.InMemory.FunctionalTests/EntityTypeTest.cs index d5cf614fca2..a8b84e50b1b 100644 --- a/test/EntityFramework.InMemory.FunctionalTests/EntityTypeTest.cs +++ b/test/EntityFramework.InMemory.FunctionalTests/EntityTypeTest.cs @@ -75,7 +75,7 @@ private void Can_add_update_delete_end_to_end() Assert.Equal("A", entry.Property(nameProperty.Name).CurrentValue); - context.Delete(entityFromStore); + context.Remove(entityFromStore); context.SaveChanges(); } diff --git a/test/EntityFramework.InMemory.FunctionalTests/GuidValueGeneratorEndToEndTest.cs b/test/EntityFramework.InMemory.FunctionalTests/GuidValueGeneratorEndToEndTest.cs index 7d87f100d8d..7f01b91a63e 100644 --- a/test/EntityFramework.InMemory.FunctionalTests/GuidValueGeneratorEndToEndTest.cs +++ b/test/EntityFramework.InMemory.FunctionalTests/GuidValueGeneratorEndToEndTest.cs @@ -28,7 +28,7 @@ public async Task Can_use_GUIDs_end_to_end_async() { for (var i = 0; i < 10; i++) { - guids.Add((await context.AddAsync(new Pegasus { Name = "Rainbow Dash " + i })).Id); + guids.Add((await context.AddAsync(new Pegasus { Name = "Rainbow Dash " + i })).Entity.Id); guidsHash.Add(guids.Last()); } diff --git a/test/EntityFramework.InMemory.FunctionalTests/InMemoryConfigPatternsTest.cs b/test/EntityFramework.InMemory.FunctionalTests/InMemoryConfigPatternsTest.cs index 5e5d3c64e9c..847ff149c3e 100644 --- a/test/EntityFramework.InMemory.FunctionalTests/InMemoryConfigPatternsTest.cs +++ b/test/EntityFramework.InMemory.FunctionalTests/InMemoryConfigPatternsTest.cs @@ -29,7 +29,7 @@ public void Can_save_and_query_with_implicit_services_and_OnConfiguring() Assert.NotEqual(0, blog.Id); Assert.Equal("The Waffle Cart", blog.Name); - context.Blogs.RemoveRange(context.Blogs); + context.Blogs.Remove(context.Blogs.ToArray()); context.SaveChanges(); Assert.Empty(context.Blogs); @@ -64,7 +64,7 @@ public void Can_save_and_query_with_implicit_services_and_explicit_config() Assert.NotEqual(0, blog.Id); Assert.Equal("The Waffle Cart", blog.Name); - context.Blogs.RemoveRange(context.Blogs); + context.Blogs.Remove(context.Blogs.ToArray()); context.SaveChanges(); Assert.Empty(context.Blogs); @@ -101,7 +101,7 @@ public void Can_save_and_query_with_explicit_services_and_OnConfiguring() Assert.NotEqual(0, blog.Id); Assert.Equal("The Waffle Cart", blog.Name); - context.Blogs.RemoveRange(context.Blogs); + context.Blogs.Remove(context.Blogs.ToArray()); context.SaveChanges(); Assert.Empty(context.Blogs); @@ -145,7 +145,7 @@ public void Can_save_and_query_with_explicit_services_and_explicit_config() Assert.NotEqual(0, blog.Id); Assert.Equal("The Waffle Cart", blog.Name); - context.Blogs.RemoveRange(context.Blogs); + context.Blogs.Remove(context.Blogs.ToArray()); context.SaveChanges(); Assert.Empty(context.Blogs); @@ -182,7 +182,7 @@ public void Can_save_and_query_with_explicit_services_and_no_config() Assert.NotEqual(0, blog.Id); Assert.Equal("The Waffle Cart", blog.Name); - context.Blogs.RemoveRange(context.Blogs); + context.Blogs.Remove(context.Blogs.ToArray()); context.SaveChanges(); Assert.Empty(context.Blogs); diff --git a/test/EntityFramework.InMemory.FunctionalTests/InMemoryDataStoreTest.cs b/test/EntityFramework.InMemory.FunctionalTests/InMemoryDataStoreTest.cs index ed00ebc1599..bebff32edb3 100644 --- a/test/EntityFramework.InMemory.FunctionalTests/InMemoryDataStoreTest.cs +++ b/test/EntityFramework.InMemory.FunctionalTests/InMemoryDataStoreTest.cs @@ -65,7 +65,7 @@ public async Task Can_add_update_delete_end_to_end() using (var context = new DbContext(serviceProvider, options)) { - context.Delete(customer); + context.Remove(customer); await context.SaveChangesAsync(); } diff --git a/test/EntityFramework.InMemory.FunctionalTests/MusicStoreQueryTests.cs b/test/EntityFramework.InMemory.FunctionalTests/MusicStoreQueryTests.cs index 454b26e2f27..61361064868 100644 --- a/test/EntityFramework.InMemory.FunctionalTests/MusicStoreQueryTests.cs +++ b/test/EntityFramework.InMemory.FunctionalTests/MusicStoreQueryTests.cs @@ -7,7 +7,6 @@ using Microsoft.Data.Entity.Metadata; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; -using Microsoft.Framework.Logging; using Xunit; namespace Microsoft.Data.Entity.InMemory.FunctionalTests @@ -32,9 +31,9 @@ var options { var albums = GetAlbums("~/Images/placeholder.png", Genres, Artists); - db.Genres.AddRange(Genres.Values); - db.Artists.AddRange(Artists.Values); - db.Albums.AddRange(albums); + db.Genres.Add(Genres.Values.ToArray()); + db.Artists.Add(Artists.Values.ToArray()); + db.Albums.Add(albums); db.SaveChanges(); } @@ -158,7 +157,7 @@ public class OrderDetail public virtual Order Order { get; set; } } - private static IEnumerable GetAlbums(string imgUrl, Dictionary genres, Dictionary artists) + private static Album[] GetAlbums(string imgUrl, Dictionary genres, Dictionary artists) { var albums = new[] { diff --git a/test/EntityFramework.InMemory.FunctionalTests/ShadowStateUpdateTest.cs b/test/EntityFramework.InMemory.FunctionalTests/ShadowStateUpdateTest.cs index 57d5e50f24d..9dc79518bda 100644 --- a/test/EntityFramework.InMemory.FunctionalTests/ShadowStateUpdateTest.cs +++ b/test/EntityFramework.InMemory.FunctionalTests/ShadowStateUpdateTest.cs @@ -135,7 +135,7 @@ public async Task Can_add_update_delete_end_to_end_using_partial_shadow_state() using (var context = new DbContext(_fixture.ServiceProvider, options)) { - context.Delete(customer); + context.Remove(customer); await context.SaveChangesAsync(); } diff --git a/test/EntityFramework.InMemory.Tests/InMemoryDataStoreCreatorTest.cs b/test/EntityFramework.InMemory.Tests/InMemoryDataStoreCreatorTest.cs index 49af200346a..ef5916519b3 100644 --- a/test/EntityFramework.InMemory.Tests/InMemoryDataStoreCreatorTest.cs +++ b/test/EntityFramework.InMemory.Tests/InMemoryDataStoreCreatorTest.cs @@ -104,7 +104,7 @@ private static async Task Delete_clears_all_in_memory_data_test(bool async) { using (var context = new FraggleContext()) { - context.Fraggles.AddRange( + context.Fraggles.Add( new[] { new Fraggle { Id = 1, Name = "Gobo" }, diff --git a/test/EntityFramework.SqlServer.FunctionalTests/CompositeKeyEndToEndTest.cs b/test/EntityFramework.SqlServer.FunctionalTests/CompositeKeyEndToEndTest.cs index 316a5af8afd..9c4187137ac 100644 --- a/test/EntityFramework.SqlServer.FunctionalTests/CompositeKeyEndToEndTest.cs +++ b/test/EntityFramework.SqlServer.FunctionalTests/CompositeKeyEndToEndTest.cs @@ -76,7 +76,7 @@ public async Task Can_use_generated_values_in_composite_key_end_to_end() { context.Database.EnsureCreated(); - var added = await context.AddAsync(new Unicorn { Id2 = id2, Name = "Rarity" }); + var added = (await context.AddAsync(new Unicorn { Id2 = id2, Name = "Rarity" })).Entity; Assert.True(added.Id1 < 0); Assert.NotEqual(Guid.Empty, added.Id3); @@ -135,9 +135,9 @@ public async Task Only_one_part_of_a_composite_key_needs_to_vary_for_uniquness() { 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" }); + var pony1 = (await context.AddAsync(new EarthPony { Id2 = 7, Name = "Apple Jack 1" })).Entity; + var pony2 = (await context.AddAsync(new EarthPony { Id2 = 7, Name = "Apple Jack 2" })).Entity; + var pony3 = (await context.AddAsync(new EarthPony { Id2 = 7, Name = "Apple Jack 3" })).Entity; await context.SaveChangesAsync(); @@ -162,14 +162,14 @@ public async Task Only_one_part_of_a_composite_key_needs_to_vary_for_uniquness() 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); + 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); + context.EarthPonies.Remove(ponies); await context.SaveChangesAsync(); } diff --git a/test/EntityFramework.SqlServer.FunctionalTests/ComputedColumnTest .cs b/test/EntityFramework.SqlServer.FunctionalTests/ComputedColumnTest .cs index 2b482a437af..54754f51f10 100644 --- a/test/EntityFramework.SqlServer.FunctionalTests/ComputedColumnTest .cs +++ b/test/EntityFramework.SqlServer.FunctionalTests/ComputedColumnTest .cs @@ -25,7 +25,7 @@ public void Can_use_computed_columns() context.Database.EnsureDeleted(); context.Database.EnsureCreated(); - var entity = context.Add(new Entity { P1 = 20, P2 = 30, P3 = 80 }); + var entity = context.Add(new Entity { P1 = 20, P2 = 30, P3 = 80 }).Entity; context.SaveChanges(); @@ -50,7 +50,7 @@ public void Can_use_computed_columns_with_null_values() context.Database.EnsureDeleted(); context.Database.EnsureCreated(); - var entity = context.Add(new Entity { P1 = 20, P2 = 30 }); + var entity = context.Add(new Entity { P1 = 20, P2 = 30 }).Entity; context.SaveChanges(); diff --git a/test/EntityFramework.SqlServer.FunctionalTests/DefaultValuesTest.cs b/test/EntityFramework.SqlServer.FunctionalTests/DefaultValuesTest.cs index 9a5055e7711..1f2630ffa7a 100644 --- a/test/EntityFramework.SqlServer.FunctionalTests/DefaultValuesTest.cs +++ b/test/EntityFramework.SqlServer.FunctionalTests/DefaultValuesTest.cs @@ -26,13 +26,13 @@ public void Can_use_SQL_Server_default_values() context.Database.EnsureDeleted(); context.Database.EnsureCreated(); - var honeyDijon = context.Add(new KettleChips { Name = "Honey Dijon" }); + var honeyDijon = context.Add(new KettleChips { Name = "Honey Dijon" }).Entity; context.SaveChanges(); Assert.Equal(new DateTime(2035, 9, 25), honeyDijon.BestBuyDate); - var buffaloBleu = context.Add(new KettleChips { Name = "Buffalo Bleu", BestBuyDate = new DateTime(2111, 1, 11) }); + var buffaloBleu = context.Add(new KettleChips { Name = "Buffalo Bleu", BestBuyDate = new DateTime(2111, 1, 11) }).Entity; context.SaveChanges(); diff --git a/test/EntityFramework.SqlServer.FunctionalTests/QueryBugsTest.cs b/test/EntityFramework.SqlServer.FunctionalTests/QueryBugsTest.cs index 5f0f8cc65bd..29b3be19d79 100644 --- a/test/EntityFramework.SqlServer.FunctionalTests/QueryBugsTest.cs +++ b/test/EntityFramework.SqlServer.FunctionalTests/QueryBugsTest.cs @@ -3,16 +3,14 @@ using System; using System.Collections.Generic; -using System.Diagnostics; - using System.Linq; using System.Threading.Tasks; -using Microsoft.Framework.DependencyInjection; +using Microsoft.Data.Entity.Metadata; using Microsoft.Data.Entity.Relational.FunctionalTests; +using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; using Microsoft.Framework.Logging; using Xunit; -using Microsoft.Data.Entity.Metadata; namespace Microsoft.Data.Entity.SqlServer.FunctionalTests { @@ -105,7 +103,7 @@ public void Include_on_entity_with_composite_key_One_To_Many_bugs_925_926() Assert.Equal(3, result[1].Orders.Count); var expectedSql = -@"SELECT [c].[FirstName], [c].[LastName] + @"SELECT [c].[FirstName], [c].[LastName] FROM [Customer] AS [c] ORDER BY [c].[FirstName], [c].[LastName] @@ -146,7 +144,7 @@ public void Include_on_entity_with_composite_key_Many_To_One_bugs_925_926() Assert.NotNull(result[4].Customer); var expectedSql = -@"SELECT [o].[CustomerId0], [o].[CustomerId1], [o].[Id], [o].[Name], [c].[FirstName], [c].[LastName] + @"SELECT [o].[CustomerId0], [o].[CustomerId1], [o].[Id], [o].[Name], [c].[FirstName], [c].[LastName] FROM [Order] AS [o] LEFT JOIN [Customer] AS [c] ON ([o].[CustomerId0] = [c].[FirstName] AND [o].[CustomerId1] = [c].[LastName])"; @@ -170,8 +168,8 @@ private void CreateDatabase925() var customer1 = new Customer { FirstName = "Customer", LastName = "One", Orders = new List { order11, order12 } }; var customer2 = new Customer { FirstName = "Customer", LastName = "Two", Orders = new List { order21, order22, order23 } }; - context.Customers.AddRange(new[] { customer1, customer2 }); - context.Orders.AddRange(new[] { order11, order12, order21, order22, order23 }); + context.Customers.Add(customer1, customer2); + context.Orders.Add(order11, order12, order21, order22, order23); context.SaveChanges(); } } @@ -286,14 +284,14 @@ private void CreateDatabase963() var aerys = new Targaryen { Name = "Aerys II" }; var details = new Details - { - FullName = @"Daenerys Stormborn of the House Targaryen, the First of Her Name, the Unburnt, Queen of Meereen, + { + FullName = @"Daenerys Stormborn of the House Targaryen, the First of Her Name, the Unburnt, Queen of Meereen, Queen of the Andals and the Rhoynar and the First Men, Khaleesi of the Great Grass Sea, Breaker of Chains, and Mother of Dragons" - }; + }; var daenerys = new Targaryen { Name = "Daenerys", Details = details, Dragons = new List { drogon, rhaegal, viserion } }; - context.Targaryens.AddRange(new[] { daenerys, aerys }); - context.Dragons.AddRange(new[] { drogon, rhaegal, viserion, balerion }); + context.Targaryens.Add(daenerys, aerys); + context.Dragons.Add(drogon, rhaegal, viserion, balerion); context.Details.Add(details); context.SaveChanges(); @@ -345,15 +343,16 @@ protected override void OnConfiguring(DbContextOptions options) protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity(m => - { - m.Key(t => t.Id); - m.OneToMany(t => t.Dragons, d => d.Mother).ForeignKey(d => d.MotherId); - m.OneToOne(t => t.Details, d => d.Targaryen).ForeignKey
(d => d.TargaryenId); - }); + { + m.Key(t => t.Id); + m.OneToMany(t => t.Dragons, d => d.Mother).ForeignKey(d => d.MotherId); + m.OneToOne(t => t.Details, d => d.Targaryen).ForeignKey
(d => d.TargaryenId); + }); } } - + private readonly SqlServerFixture _fixture; + public QueryBugsTest(SqlServerFixture fixture) { _fixture = fixture; diff --git a/test/EntityFramework.SqlServer.FunctionalTests/SequentialGuidEndToEndTest.cs b/test/EntityFramework.SqlServer.FunctionalTests/SequentialGuidEndToEndTest.cs index 1f3a52e3b1d..3d6e9c04cc9 100644 --- a/test/EntityFramework.SqlServer.FunctionalTests/SequentialGuidEndToEndTest.cs +++ b/test/EntityFramework.SqlServer.FunctionalTests/SequentialGuidEndToEndTest.cs @@ -64,7 +64,7 @@ public async Task Can_use_explicit_values() for (var i = 0; i < 50; i++) { - guids.Add((await context.AddAsync(new Pegasus { Name = "Rainbow Dash " + i, Index = i, Id = Guid.NewGuid() })).Id); + guids.Add((await context.AddAsync(new Pegasus { Name = "Rainbow Dash " + i, Index = i, Id = Guid.NewGuid() })).Entity.Id); } await context.SaveChangesAsync(); diff --git a/test/EntityFramework.SqlServer.FunctionalTests/SqlServerConfigPatternsTest.cs b/test/EntityFramework.SqlServer.FunctionalTests/SqlServerConfigPatternsTest.cs index 8dfa37a447e..789fc24d263 100644 --- a/test/EntityFramework.SqlServer.FunctionalTests/SqlServerConfigPatternsTest.cs +++ b/test/EntityFramework.SqlServer.FunctionalTests/SqlServerConfigPatternsTest.cs @@ -615,7 +615,7 @@ private async Task NestedContextTest(Func createBlogContext, Func e.Entity).Single()); await context0.SaveChangesAsync(); diff --git a/test/EntityFramework.SqlServer.FunctionalTests/SqlServerEndToEndTest.cs b/test/EntityFramework.SqlServer.FunctionalTests/SqlServerEndToEndTest.cs index cee91400f39..721ed97863b 100644 --- a/test/EntityFramework.SqlServer.FunctionalTests/SqlServerEndToEndTest.cs +++ b/test/EntityFramework.SqlServer.FunctionalTests/SqlServerEndToEndTest.cs @@ -177,7 +177,7 @@ public async Task Can_save_changes() WayRound = 9876543210, Away = 0.12345f, AndChew = new byte[16] - }); + }).Entity; await db.SaveChangesAsync(); @@ -239,7 +239,7 @@ public async Task Can_save_changes_in_tracked_entities() WayRound = 9876543210, Away = 0.12345f, AndChew = new byte[16] - }); + }).Entity; db.ChangeTracker.Entry(toAdd).State = EntityState.Unknown; var blogs = await CreateBlogDatabaseAsync(db); @@ -251,7 +251,7 @@ public async Task Can_save_changes_in_tracked_entities() toDelete.Name = "Blog to delete"; deletedId = toDelete.Id; - db.Delete(toDelete); + db.Remove(toDelete); db.ChangeTracker.Entry(toAdd).State = EntityState.Added; await db.SaveChangesAsync(); @@ -444,7 +444,7 @@ public async Task Can_round_trip_changes_with_changed_only_notification_entities blog2.NotFigTime = new DateTime(); blog2.AndChew = null; - var blog3 = context.Add(new TBlog()); + var blog3 = context.Add(new TBlog()).Entity; await context.SaveChangesAsync(); @@ -475,7 +475,7 @@ public async Task Can_round_trip_changes_with_changed_only_notification_entities private static async Task CreateBlogDatabaseAsync(DbContext context) where TBlog : class, IBlog, new() { await context.Database.EnsureCreatedAsync(); - var blog1 = await context.AddAsync(new TBlog + var blog1 = (await context.AddAsync(new TBlog { Name = "Blog1", George = true, @@ -492,8 +492,8 @@ public async Task Can_round_trip_changes_with_changed_only_notification_entities //OrUSkint = 8888888, // TODO: The parameter data type of UInt32 is invalid. //OrUShort = 888888888888888, // TODO: The parameter data type of UInt64 is invalid. AndChew = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } - }); - var blog2 = await context.AddAsync(new TBlog + })).Entity; + var blog2 = (await context.AddAsync(new TBlog { Name = "Blog2", George = false, @@ -510,7 +510,7 @@ public async Task Can_round_trip_changes_with_changed_only_notification_entities //OrUSkint = 8888888, // TODO: The parameter data type of UInt32 is invalid. //OrUShort = 888888888888888, // TODO: The parameter data type of UInt64 is invalid. AndChew = new byte[16] - }); + })).Entity; await context.SaveChangesAsync(); return new[] { blog1, blog2 }; diff --git a/test/EntityFramework.Tests/DbContextTest.cs b/test/EntityFramework.Tests/DbContextTest.cs index 806538f96a6..116f034c468 100644 --- a/test/EntityFramework.Tests/DbContextTest.cs +++ b/test/EntityFramework.Tests/DbContextTest.cs @@ -24,39 +24,6 @@ namespace Microsoft.Data.Entity.Tests { public class DbContextTest { - [Fact] - public void Members_check_arguments() - { - using (var context = new EarlyLearningCenter()) - { - Assert.Equal( - "entity", - // ReSharper disable once AssignNullToNotNullAttribute - Assert.Throws(() => context.Add(null)).ParamName); - Assert.Equal( - "entity", - // ReSharper disable once AssignNullToNotNullAttribute - Assert.ThrowsAsync(() => context.AddAsync(null)).Result.ParamName); - Assert.Equal( - "entity", - // ReSharper disable once AssignNullToNotNullAttribute - Assert.Throws( - () => context.AddAsync(null, new CancellationToken()).GetAwaiter().GetResult()).ParamName); - Assert.Equal( - "entity", - // ReSharper disable once AssignNullToNotNullAttribute - Assert.Throws(() => context.Update(null)).ParamName); - Assert.Equal( - "entity", - // ReSharper disable once AssignNullToNotNullAttribute - Assert.ThrowsAsync(() => context.UpdateAsync(null)).Result.ParamName); - Assert.Equal( - "entity", - // ReSharper disable once AssignNullToNotNullAttribute - Assert.ThrowsAsync(() => context.UpdateAsync(null, new CancellationToken())).Result.ParamName); - } - } - [Fact] public void Each_context_gets_new_scoped_services() { @@ -251,11 +218,12 @@ public void Can_add_new_entities_to_context() public void Can_add_new_entities_to_context_async() { TrackEntitiesTest((c, e) => c.AddAsync(e).Result, (c, e) => c.AddAsync(e).Result, EntityState.Added); + } - TrackEntitiesTest( - (c, e) => c.AddAsync(e, new CancellationToken()).Result, - (c, e) => c.AddAsync(e, new CancellationToken()).Result, - EntityState.Added); + [Fact] + public void Can_add_existing_entities_to_context_to_be_attached() + { + TrackEntitiesTest((c, e) => c.Attach(e), (c, e) => c.Attach(e), EntityState.Unchanged); } [Fact] @@ -265,72 +233,368 @@ public void Can_add_existing_entities_to_context_to_be_updated() } [Fact] - public void Can_add_existing_entities_to_context_to_be_updated_async() + public void Can_add_existing_entities_to_context_to_be_deleted() { - TrackEntitiesTest((c, e) => c.UpdateAsync(e).Result, (c, e) => c.UpdateAsync(e).Result, EntityState.Modified); + TrackEntitiesTest((c, e) => c.Remove(e), (c, e) => c.Remove(e), EntityState.Deleted); + } - TrackEntitiesTest( - (c, e) => c.UpdateAsync(e, new CancellationToken()).Result, - (c, e) => c.UpdateAsync(e, new CancellationToken()).Result, - EntityState.Modified); + private static void TrackEntitiesTest( + Func> categoryAdder, + Func> productAdder, EntityState expectedState) + { + using (var context = new EarlyLearningCenter(TestHelpers.CreateServiceProvider())) + { + var category1 = new Category { Id = 1, Name = "Beverages" }; + var category2 = new Category { Id = 2, Name = "Foods" }; + var product1 = new Product { Id = 1, Name = "Marmite", Price = 7.99m }; + var product2 = new Product { Id = 2, Name = "Bovril", Price = 4.99m }; + + var categoryEntry1 = categoryAdder(context, category1); + var categoryEntry2 = categoryAdder(context, category2); + var productEntry1 = productAdder(context, product1); + var productEntry2 = productAdder(context, product2); + + Assert.Same(category1, categoryEntry1.Entity); + Assert.Same(category2, categoryEntry2.Entity); + Assert.Same(product1, productEntry1.Entity); + Assert.Same(product2, productEntry2.Entity); + + Assert.Same(category1, categoryEntry1.Entity); + Assert.Equal(expectedState, categoryEntry2.State); + Assert.Same(category2, categoryEntry2.Entity); + Assert.Equal(expectedState, categoryEntry2.State); + + Assert.Same(product1, productEntry1.Entity); + Assert.Equal(expectedState, productEntry1.State); + Assert.Same(product2, productEntry2.Entity); + Assert.Equal(expectedState, productEntry2.State); + + Assert.Same(categoryEntry1.StateEntry, context.ChangeTracker.Entry(category1).StateEntry); + Assert.Same(categoryEntry2.StateEntry, context.ChangeTracker.Entry(category2).StateEntry); + Assert.Same(productEntry1.StateEntry, context.ChangeTracker.Entry(product1).StateEntry); + Assert.Same(productEntry2.StateEntry, context.ChangeTracker.Entry(product2).StateEntry); + } } [Fact] - public void Can_add_existing_entities_to_context_to_be_deleted() + public void Can_add_multiple_new_entities_to_context() { - TrackEntitiesTest((c, e) => c.Delete(e), (c, e) => c.Delete(e), EntityState.Deleted); + TrackMultipleEntitiesTest((c, e) => c.Add(e[0], e[1]), (c, e) => c.Add(e[0], e[1]), EntityState.Added); } - private static void TrackEntitiesTest( - Func categoryAdder, - Func productAdder, EntityState expectedState) + [Fact] + public void Can_add_multiple_new_entities_to_context_async() { - using (var context = new EarlyLearningCenter()) + TrackMultipleEntitiesTest((c, e) => c.AddAsync(e[0], e[1]).Result, (c, e) => c.AddAsync(e[0], e[1]).Result, EntityState.Added); + + TrackMultipleEntitiesTest( + (c, e) => c.AddAsync(new[] { e[0], e[1] }, new CancellationToken()).Result, + (c, e) => c.AddAsync(new[] { e[0], e[1] }, new CancellationToken()).Result, EntityState.Added); + } + + [Fact] + public void Can_add_multiple_existing_entities_to_context_to_be_attached() + { + TrackMultipleEntitiesTest((c, e) => c.Attach(e[0], e[1]), (c, e) => c.Attach(e[0], e[1]), EntityState.Unchanged); + } + + [Fact] + public void Can_add_multiple_existing_entities_to_context_to_be_updated() + { + TrackMultipleEntitiesTest((c, e) => c.Update(e[0], e[1]), (c, e) => c.Update(e[0], e[1]), EntityState.Modified); + } + + [Fact] + public void Can_add_multiple_existing_entities_to_context_to_be_deleted() + { + TrackMultipleEntitiesTest((c, e) => c.Remove(e[0], e[1]), (c, e) => c.Remove(e[0], e[1]), EntityState.Deleted); + } + + private static void TrackMultipleEntitiesTest( + Func>> categoryAdder, + Func>> productAdder, EntityState expectedState) + { + using (var context = new EarlyLearningCenter(TestHelpers.CreateServiceProvider())) + { + var category1 = new Category { Id = 1, Name = "Beverages" }; + var category2 = new Category { Id = 2, Name = "Foods" }; + var product1 = new Product { Id = 1, Name = "Marmite", Price = 7.99m }; + var product2 = new Product { Id = 2, Name = "Bovril", Price = 4.99m }; + + var categoryEntries = categoryAdder(context, new [] { category1, category2 }); + var productEntries = productAdder(context, new[] { product1, product2 }); + + Assert.Equal(2, categoryEntries.Count); + Assert.Equal(2, productEntries.Count); + + Assert.Same(category1, categoryEntries[0].Entity); + Assert.Same(category2, categoryEntries[1].Entity); + Assert.Same(product1, productEntries[0].Entity); + Assert.Same(product2, productEntries[1].Entity); + + Assert.Same(category1, categoryEntries[0].Entity); + Assert.Equal(expectedState, categoryEntries[0].State); + Assert.Same(category2, categoryEntries[1].Entity); + Assert.Equal(expectedState, categoryEntries[1].State); + + Assert.Same(product1, productEntries[0].Entity); + Assert.Equal(expectedState, productEntries[0].State); + Assert.Same(product2, productEntries[1].Entity); + Assert.Equal(expectedState, productEntries[1].State); + + Assert.Same(categoryEntries[0].StateEntry, context.ChangeTracker.Entry(category1).StateEntry); + Assert.Same(categoryEntries[1].StateEntry, context.ChangeTracker.Entry(category2).StateEntry); + Assert.Same(productEntries[0].StateEntry, context.ChangeTracker.Entry(product1).StateEntry); + Assert.Same(productEntries[1].StateEntry, context.ChangeTracker.Entry(product2).StateEntry); + } + } + + [Fact] + public void Can_add_no_new_entities_to_context() + { + TrackNoEntitiesTest(c => c.Add(new Category[0]), c => c.Add(new Product[0]), EntityState.Added); + } + + [Fact] + public void Can_add_no_new_entities_to_context_async() + { + TrackNoEntitiesTest(c => c.AddAsync(new Category[0]).Result, c => c.AddAsync(new Product[0]).Result, EntityState.Added); + + TrackNoEntitiesTest( + c => c.AddAsync(new Category[0], new CancellationToken()).Result, + c => c.AddAsync(new Product[0], new CancellationToken()).Result, EntityState.Added); + } + + [Fact] + public void Can_add_no_existing_entities_to_context_to_be_attached() + { + TrackNoEntitiesTest(c => c.Attach(new Category[0]), c => c.Attach(new Product[0]), EntityState.Unchanged); + } + + [Fact] + public void Can_add_no_existing_entities_to_context_to_be_updated() + { + TrackNoEntitiesTest(c => c.Update(new Category[0]), c => c.Update(new Product[0]), EntityState.Modified); + } + + [Fact] + public void Can_add_no_existing_entities_to_context_to_be_deleted() + { + TrackNoEntitiesTest(c => c.Remove(new Category[0]), c => c.Remove(new Product[0]), EntityState.Deleted); + } + + private static void TrackNoEntitiesTest( + Func>> categoryAdder, + Func>> productAdder, EntityState expectedState) + { + using (var context = new EarlyLearningCenter(TestHelpers.CreateServiceProvider())) + { + Assert.Empty(categoryAdder(context)); + Assert.Empty(productAdder(context)); + } + } + + [Fact] + public void Can_add_new_entities_to_context_non_generic() + { + TrackEntitiesTestNonGeneric((c, e) => c.Add(e), (c, e) => c.Add(e), EntityState.Added); + } + + [Fact] + public void Can_add_new_entities_to_context_async_non_generic() + { + TrackEntitiesTestNonGeneric((c, e) => c.AddAsync(e).Result, (c, e) => c.AddAsync(e).Result, EntityState.Added); + } + + [Fact] + public void Can_add_existing_entities_to_context_to_be_attached_non_generic() + { + TrackEntitiesTestNonGeneric((c, e) => c.Attach(e), (c, e) => c.Attach(e), EntityState.Unchanged); + } + + [Fact] + public void Can_add_existing_entities_to_context_to_be_updated_non_generic() + { + TrackEntitiesTestNonGeneric((c, e) => c.Update(e), (c, e) => c.Update(e), EntityState.Modified); + } + + [Fact] + public void Can_add_existing_entities_to_context_to_be_deleted_non_generic() + { + TrackEntitiesTestNonGeneric((c, e) => c.Remove(e), (c, e) => c.Remove(e), EntityState.Deleted); + } + + private static void TrackEntitiesTestNonGeneric( + Func categoryAdder, + Func productAdder, EntityState expectedState) + { + using (var context = new EarlyLearningCenter(TestHelpers.CreateServiceProvider())) + { + var category1 = new Category { Id = 1, Name = "Beverages" }; + var category2 = new Category { Id = 2, Name = "Foods" }; + var product1 = new Product { Id = 1, Name = "Marmite", Price = 7.99m }; + var product2 = new Product { Id = 2, Name = "Bovril", Price = 4.99m }; + + var categoryEntry1 = categoryAdder(context, category1); + var categoryEntry2 = categoryAdder(context, category2); + var productEntry1 = productAdder(context, product1); + var productEntry2 = productAdder(context, product2); + + Assert.Same(category1, categoryEntry1.Entity); + Assert.Same(category2, categoryEntry2.Entity); + Assert.Same(product1, productEntry1.Entity); + Assert.Same(product2, productEntry2.Entity); + + Assert.Same(category1, categoryEntry1.Entity); + Assert.Equal(expectedState, categoryEntry2.State); + Assert.Same(category2, categoryEntry2.Entity); + Assert.Equal(expectedState, categoryEntry2.State); + + Assert.Same(product1, productEntry1.Entity); + Assert.Equal(expectedState, productEntry1.State); + Assert.Same(product2, productEntry2.Entity); + Assert.Equal(expectedState, productEntry2.State); + + Assert.Same(categoryEntry1.StateEntry, context.ChangeTracker.Entry(category1).StateEntry); + Assert.Same(categoryEntry2.StateEntry, context.ChangeTracker.Entry(category2).StateEntry); + Assert.Same(productEntry1.StateEntry, context.ChangeTracker.Entry(product1).StateEntry); + Assert.Same(productEntry2.StateEntry, context.ChangeTracker.Entry(product2).StateEntry); + } + } + + [Fact] + public void Can_add_multiple_new_entities_to_context_non_generic() + { + TrackMultipleEntitiesTestNonGeneric((c, e) => c.Add(e[0], e[1]), (c, e) => c.Add(e[0], e[1]), EntityState.Added); + } + + [Fact] + public void Can_add_multiple_new_entities_to_context_async_non_generic() + { + TrackMultipleEntitiesTestNonGeneric((c, e) => c.AddAsync(e[0], e[1]).Result, (c, e) => c.AddAsync(e[0], e[1]).Result, EntityState.Added); + + TrackMultipleEntitiesTestNonGeneric( + (c, e) => c.AddAsync(new[] { e[0], e[1] }, new CancellationToken()).Result, + (c, e) => c.AddAsync(new[] { e[0], e[1] }, new CancellationToken()).Result, EntityState.Added); + } + + [Fact] + public void Can_add_multiple_existing_entities_to_context_to_be_attached_non_generic() + { + TrackMultipleEntitiesTestNonGeneric((c, e) => c.Attach(e[0], e[1]), (c, e) => c.Attach(e[0], e[1]), EntityState.Unchanged); + } + + [Fact] + public void Can_add_multiple_existing_entities_to_context_to_be_updated_non_generic() + { + TrackMultipleEntitiesTestNonGeneric((c, e) => c.Update(e[0], e[1]), (c, e) => c.Update(e[0], e[1]), EntityState.Modified); + } + + [Fact] + public void Can_add_multiple_existing_entities_to_context_to_be_deleted_non_generic() + { + TrackMultipleEntitiesTestNonGeneric((c, e) => c.Remove(e[0], e[1]), (c, e) => c.Remove(e[0], e[1]), EntityState.Deleted); + } + + private static void TrackMultipleEntitiesTestNonGeneric( + Func> categoryAdder, + Func> productAdder, EntityState expectedState) + { + using (var context = new EarlyLearningCenter(TestHelpers.CreateServiceProvider())) { var category1 = new Category { Id = 1, Name = "Beverages" }; var category2 = new Category { Id = 2, Name = "Foods" }; var product1 = new Product { Id = 1, Name = "Marmite", Price = 7.99m }; var product2 = new Product { Id = 2, Name = "Bovril", Price = 4.99m }; - Assert.Same(category1, categoryAdder(context, category1)); - Assert.Same(category2, categoryAdder(context, category2)); - Assert.Same(product1, productAdder(context, product1)); - Assert.Same(product2, productAdder(context, product2)); + var categoryEntries = categoryAdder(context, new[] { category1, category2 }); + var productEntries = productAdder(context, new[] { product1, product2 }); + + Assert.Equal(2, categoryEntries.Count); + Assert.Equal(2, productEntries.Count); - var categoryEntry = context.ChangeTracker.Entry(category1); - Assert.Same(category1, categoryEntry.Entity); - Assert.Equal(expectedState, categoryEntry.State); + Assert.Same(category1, categoryEntries[0].Entity); + Assert.Same(category2, categoryEntries[1].Entity); + Assert.Same(product1, productEntries[0].Entity); + Assert.Same(product2, productEntries[1].Entity); - categoryEntry = context.ChangeTracker.Entry(category2); - Assert.Same(category2, categoryEntry.Entity); - Assert.Equal(expectedState, categoryEntry.State); + Assert.Same(category1, categoryEntries[0].Entity); + Assert.Equal(expectedState, categoryEntries[0].State); + Assert.Same(category2, categoryEntries[1].Entity); + Assert.Equal(expectedState, categoryEntries[1].State); - var productEntry = context.ChangeTracker.Entry(product1); - Assert.Same(product1, productEntry.Entity); - Assert.Equal(expectedState, productEntry.State); + Assert.Same(product1, productEntries[0].Entity); + Assert.Equal(expectedState, productEntries[0].State); + Assert.Same(product2, productEntries[1].Entity); + Assert.Equal(expectedState, productEntries[1].State); - productEntry = context.ChangeTracker.Entry(product2); - Assert.Same(product2, productEntry.Entity); - Assert.Equal(expectedState, productEntry.State); + Assert.Same(categoryEntries[0].StateEntry, context.ChangeTracker.Entry(category1).StateEntry); + Assert.Same(categoryEntries[1].StateEntry, context.ChangeTracker.Entry(category2).StateEntry); + Assert.Same(productEntries[0].StateEntry, context.ChangeTracker.Entry(product1).StateEntry); + Assert.Same(productEntries[1].StateEntry, context.ChangeTracker.Entry(product2).StateEntry); + } + } + + [Fact] + public void Can_add_no_new_entities_to_context_non_generic() + { + TrackNoEntitiesTestNonGeneric(c => c.Add(), c => c.Add(), EntityState.Added); + } + + [Fact] + public void Can_add_no_new_entities_to_context_async_non_generic() + { + TrackNoEntitiesTestNonGeneric(c => c.AddAsync().Result, c => c.AddAsync().Result, EntityState.Added); + + TrackNoEntitiesTestNonGeneric( + c => c.AddAsync(new object[0], new CancellationToken()).Result, + c => c.AddAsync(new object[0], new CancellationToken()).Result, EntityState.Added); + } + + [Fact] + public void Can_add_no_existing_entities_to_context_to_be_attached_non_generic() + { + TrackNoEntitiesTestNonGeneric(c => c.Attach(), c => c.Attach(), EntityState.Unchanged); + } + + [Fact] + public void Can_add_no_existing_entities_to_context_to_be_updated_non_generic() + { + TrackNoEntitiesTestNonGeneric(c => c.Update(), c => c.Update(), EntityState.Modified); + } + + [Fact] + public void Can_add_no_existing_entities_to_context_to_be_deleted_non_generic() + { + TrackNoEntitiesTestNonGeneric(c => c.Remove(), c => c.Remove(), EntityState.Deleted); + } + + private static void TrackNoEntitiesTestNonGeneric( + Func> categoryAdder, + Func> productAdder, EntityState expectedState) + { + using (var context = new EarlyLearningCenter(TestHelpers.CreateServiceProvider())) + { + Assert.Empty(categoryAdder(context)); + Assert.Empty(productAdder(context)); } } [Fact] public void Can_add_new_entities_to_context_with_key_generation() { - TrackEntitiesWithKeyGenerationTest((c, e) => c.Add(e)); + TrackEntitiesWithKeyGenerationTest((c, e) => c.Add(e).Entity); } [Fact] public void Can_add_new_entities_to_context_with_key_generation_async() { - TrackEntitiesWithKeyGenerationTest((c, e) => c.AddAsync(e).Result); - TrackEntitiesWithKeyGenerationTest((c, e) => c.AddAsync(e, new CancellationToken()).Result); + TrackEntitiesWithKeyGenerationTest((c, e) => c.AddAsync(e).Result.Entity); } private static void TrackEntitiesWithKeyGenerationTest(Func adder) { - using (var context = new EarlyLearningCenter()) + using (var context = new EarlyLearningCenter(TestHelpers.CreateServiceProvider())) { var gu1 = new TheGu { ShirtColor = "Red" }; var gu2 = new TheGu { ShirtColor = "Still Red" }; @@ -354,7 +618,7 @@ private static void TrackEntitiesWithKeyGenerationTest(Func m.Add(It.IsAny())).Returns(e => e); + TrackEntitiesTest((c, e) => c.Add(e), (c, e) => c.Add(e), EntityState.Added); + } - var entity = new Random(); - Assert.Same(entity, new DbSet(contextMock.Object).Add(entity)); + [Fact] + public void Can_add_new_entities_to_context_async() + { + TrackEntitiesTest((c, e) => c.AddAsync(e).Result, (c, e) => c.AddAsync(e).Result, EntityState.Added); + } - contextMock.Verify(m => m.Add(entity)); + [Fact] + public void Can_add_existing_entities_to_context_to_be_attached() + { + TrackEntitiesTest((c, e) => c.Attach(e), (c, e) => c.Attach(e), EntityState.Unchanged); } [Fact] - public void Can_add_new_entities_to_context_async() + public void Can_add_existing_entities_to_context_to_be_updated() + { + TrackEntitiesTest((c, e) => c.Update(e), (c, e) => c.Update(e), EntityState.Modified); + } + + [Fact] + public void Can_add_existing_entities_to_context_to_be_deleted() { - var contextMock = CreateContextMock(); - contextMock.Setup(m => m.AddAsync(It.IsAny(), It.IsAny())) - .Returns((e, c) => Task.FromResult(e)); + TrackEntitiesTest((c, e) => c.Remove(e), (c, e) => c.Remove(e), EntityState.Deleted); + } + + private static void TrackEntitiesTest( + Func, Category, EntityEntry> categoryAdder, + Func, Product, EntityEntry> productAdder, EntityState expectedState) + { + using (var context = new EarlyLearningCenter(TestHelpers.CreateServiceProvider())) + { + var category1 = new Category { Id = 1, Name = "Beverages" }; + var category2 = new Category { Id = 2, Name = "Foods" }; + var product1 = new Product { Id = 1, Name = "Marmite", Price = 7.99m }; + var product2 = new Product { Id = 2, Name = "Bovril", Price = 4.99m }; + + var categoryEntry1 = categoryAdder(context.Categories, category1); + var categoryEntry2 = categoryAdder(context.Categories, category2); + var productEntry1 = productAdder(context.Products, product1); + var productEntry2 = productAdder(context.Products, product2); + + Assert.Same(category1, categoryEntry1.Entity); + Assert.Same(category2, categoryEntry2.Entity); + Assert.Same(product1, productEntry1.Entity); + Assert.Same(product2, productEntry2.Entity); + + Assert.Same(category1, categoryEntry1.Entity); + Assert.Equal(expectedState, categoryEntry2.State); + Assert.Same(category2, categoryEntry2.Entity); + Assert.Equal(expectedState, categoryEntry2.State); - var entity = new Random(); - Assert.Same(entity, new DbSet(contextMock.Object).AddAsync(entity).Result); + Assert.Same(product1, productEntry1.Entity); + Assert.Equal(expectedState, productEntry1.State); + Assert.Same(product2, productEntry2.Entity); + Assert.Equal(expectedState, productEntry2.State); - contextMock.Verify(m => m.AddAsync(entity, CancellationToken.None)); + Assert.Same(categoryEntry1.StateEntry, context.ChangeTracker.Entry(category1).StateEntry); + Assert.Same(categoryEntry2.StateEntry, context.ChangeTracker.Entry(category2).StateEntry); + Assert.Same(productEntry1.StateEntry, context.ChangeTracker.Entry(product1).StateEntry); + Assert.Same(productEntry2.StateEntry, context.ChangeTracker.Entry(product2).StateEntry); + } } [Fact] - public void Can_add_new_entities_to_context_async_with_token() + public void Can_add_multiple_new_entities_to_context() { - var contextMock = CreateContextMock(); - contextMock.Setup(m => m.AddAsync(It.IsAny(), It.IsAny())) - .Returns((e, c) => Task.FromResult(e)); + TrackMultipleEntitiesTest((c, e) => c.Add(e[0], e[1]), (c, e) => c.Add(e[0], e[1]), EntityState.Added); + } - var entity = new Random(); - var cancellationToken = new CancellationToken(); - Assert.Same(entity, new DbSet(contextMock.Object).AddAsync(entity, cancellationToken).Result); + [Fact] + public void Can_add_multiple_new_entities_to_context_async() + { + TrackMultipleEntitiesTest((c, e) => c.AddAsync(e[0], e[1]).Result, (c, e) => c.AddAsync(e[0], e[1]).Result, EntityState.Added); + + TrackMultipleEntitiesTest( + (c, e) => c.AddAsync(new CancellationToken(), e[0], e[1]).Result, + (c, e) => c.AddAsync(new CancellationToken(), e[0], e[1]).Result, EntityState.Added); + } + + [Fact] + public void Can_add_multiple_existing_entities_to_context_to_be_attached() + { + TrackMultipleEntitiesTest((c, e) => c.Attach(e[0], e[1]), (c, e) => c.Attach(e[0], e[1]), EntityState.Unchanged); + } - contextMock.Verify(m => m.AddAsync(entity, cancellationToken)); + [Fact] + public void Can_add_multiple_existing_entities_to_context_to_be_updated() + { + TrackMultipleEntitiesTest((c, e) => c.Update(e[0], e[1]), (c, e) => c.Update(e[0], e[1]), EntityState.Modified); } [Fact] - public void Can_add_existing_entities_for_update_to_context() + public void Can_add_multiple_existing_entities_to_context_to_be_deleted() + { + TrackMultipleEntitiesTest((c, e) => c.Remove(e[0], e[1]), (c, e) => c.Remove(e[0], e[1]), EntityState.Deleted); + } + + private static void TrackMultipleEntitiesTest( + Func, Category[], IReadOnlyList>> categoryAdder, + Func, Product[], IReadOnlyList>> productAdder, EntityState expectedState) { - var contextMock = CreateContextMock(); - contextMock.Setup(m => m.Update(It.IsAny())).Returns(e => e); + using (var context = new EarlyLearningCenter(TestHelpers.CreateServiceProvider())) + { + var category1 = new Category { Id = 1, Name = "Beverages" }; + var category2 = new Category { Id = 2, Name = "Foods" }; + var product1 = new Product { Id = 1, Name = "Marmite", Price = 7.99m }; + var product2 = new Product { Id = 2, Name = "Bovril", Price = 4.99m }; - var entity = new Random(); - Assert.Same(entity, new DbSet(contextMock.Object).Update(entity)); + var categoryEntries = categoryAdder(context.Categories, new[] { category1, category2 }); + var productEntries = productAdder(context.Products, new[] { product1, product2 }); - contextMock.Verify(m => m.Update(entity)); + Assert.Same(category1, categoryEntries[0].Entity); + Assert.Same(category2, categoryEntries[1].Entity); + Assert.Same(product1, productEntries[0].Entity); + Assert.Same(product2, productEntries[1].Entity); + + Assert.Same(category1, categoryEntries[0].Entity); + Assert.Equal(expectedState, categoryEntries[0].State); + Assert.Same(category2, categoryEntries[1].Entity); + Assert.Equal(expectedState, categoryEntries[1].State); + + Assert.Same(product1, productEntries[0].Entity); + Assert.Equal(expectedState, productEntries[0].State); + Assert.Same(product2, productEntries[1].Entity); + Assert.Equal(expectedState, productEntries[1].State); + + Assert.Same(categoryEntries[0].StateEntry, context.ChangeTracker.Entry(category1).StateEntry); + Assert.Same(categoryEntries[1].StateEntry, context.ChangeTracker.Entry(category2).StateEntry); + Assert.Same(productEntries[0].StateEntry, context.ChangeTracker.Entry(product1).StateEntry); + Assert.Same(productEntries[1].StateEntry, context.ChangeTracker.Entry(product2).StateEntry); + } } [Fact] - public void Can_add_existing_entities_for_update_to_context_async() + public void Can_add_no_new_entities_to_context() { - var contextMock = CreateContextMock(); - contextMock.Setup(m => m.UpdateAsync(It.IsAny(), It.IsAny())) - .Returns((e, c) => Task.FromResult(e)); + TrackNoEntitiesTest(c => c.Add(new Category[0]), c => c.Add(new Product[0]), EntityState.Added); + } - var entity = new Random(); - Assert.Same(entity, new DbSet(contextMock.Object).UpdateAsync(entity).Result); + [Fact] + public void Can_add_no_new_entities_to_context_async() + { + TrackNoEntitiesTest(c => c.AddAsync(new Category[0]).Result, c => c.AddAsync(new Product[0]).Result, EntityState.Added); - contextMock.Verify(m => m.UpdateAsync(entity, CancellationToken.None)); + TrackNoEntitiesTest( + c => c.AddAsync(new CancellationToken(), new Category[0]).Result, + c => c.AddAsync(new CancellationToken(), new Product[0]).Result, EntityState.Added); + } + + [Fact] + public void Can_add_no_existing_entities_to_context_to_be_attached() + { + TrackNoEntitiesTest(c => c.Attach(new Category[0]), c => c.Attach(new Product[0]), EntityState.Unchanged); + } + + [Fact] + public void Can_add_no_existing_entities_to_context_to_be_updated() + { + TrackNoEntitiesTest(c => c.Update(new Category[0]), c => c.Update(new Product[0]), EntityState.Modified); } [Fact] - public void Can_add_existing_entities_for_update_to_context_async_with_token() + public void Can_add_no_existing_entities_to_context_to_be_deleted() { - var contextMock = CreateContextMock(); - contextMock.Setup(m => m.UpdateAsync(It.IsAny(), It.IsAny())) - .Returns((e, c) => Task.FromResult(e)); + TrackNoEntitiesTest(c => c.Remove(new Category[0]), c => c.Remove(new Product[0]), EntityState.Deleted); + } - var entity = new Random(); - var cancellationToken = new CancellationToken(); - Assert.Same(entity, new DbSet(contextMock.Object).UpdateAsync(entity, cancellationToken).Result); + private static void TrackNoEntitiesTest( + Func, IReadOnlyList>> categoryAdder, + Func, IReadOnlyList>> productAdder, EntityState expectedState) + { + using (var context = new EarlyLearningCenter(TestHelpers.CreateServiceProvider())) + { + Assert.Empty(categoryAdder(context.Categories)); + Assert.Empty(productAdder(context.Products)); + } + } + [Fact] + public void Can_add_new_entities_to_context_with_key_generation() + { + TrackEntitiesWithKeyGenerationTest((c, e) => c.Add(e).Entity); + } - contextMock.Verify(m => m.UpdateAsync(entity, cancellationToken)); + [Fact] + public void Can_add_new_entities_to_context_with_key_generation_async() + { + TrackEntitiesWithKeyGenerationTest((c, e) => c.AddAsync(e).Result.Entity); } - private static Mock CreateContextMock() + private static void TrackEntitiesWithKeyGenerationTest(Func, TheGu, TheGu> adder) { - var contextMock = new Mock(); - return contextMock; + using (var context = new EarlyLearningCenter(TestHelpers.CreateServiceProvider())) + { + var gu1 = new TheGu { ShirtColor = "Red" }; + var gu2 = new TheGu { ShirtColor = "Still Red" }; + + Assert.Same(gu1, adder(context.Gus, gu1)); + Assert.Same(gu2, adder(context.Gus, gu2)); + Assert.NotEqual(default(Guid), gu1.Id); + Assert.NotEqual(default(Guid), gu2.Id); + Assert.NotEqual(gu1.Id, gu2.Id); + + var categoryEntry = context.ChangeTracker.Entry(gu1); + Assert.Same(gu1, categoryEntry.Entity); + Assert.Equal(EntityState.Added, categoryEntry.State); + + categoryEntry = context.ChangeTracker.Entry(gu2); + Assert.Same(gu2, categoryEntry.Entity); + Assert.Equal(EntityState.Added, categoryEntry.State); + } + } + + private class Category + { + public int Id { get; set; } + public string Name { get; set; } + } + + private class Product + { + public int Id { get; set; } + public string Name { get; set; } + public decimal Price { get; set; } + } + + private class TheGu + { + public Guid Id { get; set; } + public string ShirtColor { get; set; } + } + + private class EarlyLearningCenter : DbContext + { + public EarlyLearningCenter(IServiceProvider serviceProvider) + : base(serviceProvider) + { + } + + public DbSet Products { get; set; } + public DbSet Categories { get; set; } + public DbSet Gus { get; set; } + + protected internal override void OnConfiguring(DbContextOptions options) + { + options.UseInMemoryStore(persist: false); + } } } }