diff --git a/src/EntityFramework.BulkInsert.Test/App.config b/src/EntityFramework.BulkInsert.Test/App.config index 5d3c228..cbef38e 100644 --- a/src/EntityFramework.BulkInsert.Test/App.config +++ b/src/EntityFramework.BulkInsert.Test/App.config @@ -11,6 +11,7 @@ + diff --git a/src/EntityFramework.BulkInsert.Test/EntityFramework.BulkInsert.Test.csproj b/src/EntityFramework.BulkInsert.Test/EntityFramework.BulkInsert.Test.csproj index 3a26cf4..1dba5ce 100644 --- a/src/EntityFramework.BulkInsert.Test/EntityFramework.BulkInsert.Test.csproj +++ b/src/EntityFramework.BulkInsert.Test/EntityFramework.BulkInsert.Test.csproj @@ -170,6 +170,14 @@ + + + + + + + + diff --git a/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/01 StandardInheritance/Child.cs b/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/01 StandardInheritance/Child.cs new file mode 100644 index 0000000..afe81f3 --- /dev/null +++ b/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/01 StandardInheritance/Child.cs @@ -0,0 +1,12 @@ +using System; +using System.ComponentModel.DataAnnotations.Schema; + +namespace EntityFramework.BulkInsert.Test +{ + [Table("Childs")] + public class Child : Parent + { + public DateTime CreateDate { get; set; } + public DateTime? UpdateDate { get; set; } + } +} diff --git a/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/01 StandardInheritance/Parent.cs b/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/01 StandardInheritance/Parent.cs new file mode 100644 index 0000000..42e0f94 --- /dev/null +++ b/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/01 StandardInheritance/Parent.cs @@ -0,0 +1,16 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace EntityFramework.BulkInsert.Test +{ + public class Parent + { + [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] + public long ID { get; set; } + + [MaxLength(10)] + public string Number { get; set; } + + public bool IsEmpty { get; set; } + } +} diff --git a/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/02 TablePerType/AbstractParent.cs b/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/02 TablePerType/AbstractParent.cs new file mode 100644 index 0000000..525a563 --- /dev/null +++ b/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/02 TablePerType/AbstractParent.cs @@ -0,0 +1,16 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace EntityFramework.BulkInsert.Test +{ + public abstract class AbstractParent + { + [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] + public long ID { get; set; } + + [MaxLength(10)] + public string Number { get; set; } + + public bool IsEmpty { get; set; } + } +} diff --git a/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/02 TablePerType/ApChild.cs b/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/02 TablePerType/ApChild.cs new file mode 100644 index 0000000..e644bd4 --- /dev/null +++ b/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/02 TablePerType/ApChild.cs @@ -0,0 +1,15 @@ +using System; +using System.ComponentModel.DataAnnotations.Schema; + +namespace EntityFramework.BulkInsert.Test +{ + /// + /// Child of abstract parent. + /// + [Table("ApChilds")] + public class ApChild : AbstractParent + { + public DateTime CreateDate { get; set; } + public DateTime? UpdateDate { get; set; } + } +} diff --git a/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/03 Renamed Tables/RenamedChild.cs b/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/03 Renamed Tables/RenamedChild.cs new file mode 100644 index 0000000..59283ef --- /dev/null +++ b/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/03 Renamed Tables/RenamedChild.cs @@ -0,0 +1,12 @@ +using System; +using System.ComponentModel.DataAnnotations.Schema; + +namespace EntityFramework.BulkInsert.Test +{ + [Table("RenamedChild")] + public class RenamedChild : RenamedParent + { + public DateTime CreateDate { get; set; } + public DateTime? UpdateDate { get; set; } + } +} diff --git a/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/03 Renamed Tables/RenamedParent.cs b/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/03 Renamed Tables/RenamedParent.cs new file mode 100644 index 0000000..0a46c4f --- /dev/null +++ b/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/03 Renamed Tables/RenamedParent.cs @@ -0,0 +1,17 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace EntityFramework.BulkInsert.Test +{ + [Table("RenamedDocument")] + public class RenamedParent + { + [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] + public long ID { get; set; } + + [MaxLength(10)] + public string Number { get; set; } + + public bool IsEmpty { get; set; } + } +} diff --git a/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/InheritanceIssueContext.cs b/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/InheritanceIssueContext.cs new file mode 100644 index 0000000..8f94d39 --- /dev/null +++ b/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/InheritanceIssueContext.cs @@ -0,0 +1,40 @@ +using EntityFramework.BulkInsert.Test.CodeFirst; +using EntityFramework.BulkInsert.Test.CodeFirst.Domain; +#if EF6 +#endif + +#if EF4 +using System.ComponentModel.DataAnnotations; +#endif + +#if EF5 +using System.ComponentModel.DataAnnotations.Schema; +#endif + +using System.Data.Entity; + +namespace EntityFramework.BulkInsert.Test +{ +#if EF6 + [DbConfigurationType(typeof(SqlContextConfig))] +#endif + public class InheritanceIssueContext : DbContext + { + public InheritanceIssueContext() : base("InheritanceIssueContext") + { + } + + public InheritanceIssueContext(string connectionStringName) : base(connectionStringName) + { + } + + public DbSet Parents { get; set; } + public DbSet Childs { get; set; } + + public DbSet AbstractParents { get; set; } + public DbSet ApChilds { get; set; } + + public DbSet RenamedParents { get; set; } + public DbSet RenamedChilds { get; set; } + } +} \ No newline at end of file diff --git a/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/InheritanceTests.cs b/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/InheritanceTests.cs new file mode 100644 index 0000000..8842fdb --- /dev/null +++ b/src/EntityFramework.BulkInsert.Test/IssueWithInheritance/InheritanceTests.cs @@ -0,0 +1,237 @@ +using EntityFramework.BulkInsert.Extensions; +using EntityFramework.BulkInsert.Test.CodeFirst; +using NUnit.Framework; +using System; +using System.Linq; + +namespace EntityFramework.BulkInsert.Test +{ + class InheritanceTests : TestBase + { + protected override InheritanceIssueContext GetContext() + { + return new InheritanceIssueContext(); + } + +#if EF6 + [Test] + public void BulkInsert_OnlyParent_OneRowInserted() + { + using (var ctx = GetContext()) + { + var parent = new Parent() + { + ID = 1, + Number = "1", + IsEmpty = true, + }; + + ctx.BulkInsert(new Parent[] { parent }); + + Assert.AreEqual(1, ctx.Parents.Count()); + } + } + + [Test] + public void BulkInsertChild_ParentExists_OneRowInserted() + { + using (var ctx = GetContext()) + { + var parent = new Parent() + { + ID = 1, + Number = "1", + IsEmpty = true, + }; + ctx.Parents.Add(parent); + ctx.SaveChanges(); + + var child = new Child() + { + ID = 1, + CreateDate = DateTime.Now, + }; + + ctx.BulkInsert(new Child[] { child }); + + Assert.AreEqual(1, ctx.Parents.Count()); + Assert.AreEqual(1, ctx.Childs.Count()); + } + } + + [Test] + public void BulkInsertChild_ParentNotExists_OneRowInserted() + { + using (var ctx = GetContext()) + { + var child = new Child() + { + ID = 1, + Number = "1", + IsEmpty = true, + CreateDate = DateTime.Now, + }; + + ctx.BulkInsert(new Child[] { child }); + + Assert.AreEqual(1, ctx.Parents.Count()); + Assert.AreEqual(1, ctx.Childs.Count()); + } + } + + [Test] + public void BulkInsertParentAndChild_TwoTablesUpdated() + { + using (var ctx = GetContext()) + { + var parent = new Parent() + { + ID = 1, + Number = "1", + IsEmpty = true, + }; + + var child = new Child() + { + ID = 1, + CreateDate = DateTime.Now, + }; + + ctx.BulkInsert(new Parent[] { parent }); + ctx.BulkInsert(new Child[] { child }); + + Assert.AreEqual(1, ctx.Parents.Count()); + Assert.AreEqual(1, ctx.Childs.Count()); + } + } + + [Test] + public void BulkInsertApChild_OneRowInserted() + { + using (var ctx = GetContext()) + { + var child = new ApChild() + { + ID = 1, + Number = "1", + IsEmpty = true, + CreateDate = DateTime.Now, + }; + + ctx.BulkInsert(new ApChild[] { child }); + + Assert.AreEqual(1, ctx.AbstractParents.Count()); + Assert.AreEqual(1, ctx.ApChilds.Count()); + } + } + + [Test] + public void BulkInsert_RenamedParent_OneRowInserted() + { + using (var ctx = GetContext()) + { + var parent = new RenamedParent() + { + ID = 1, + Number = "1", + IsEmpty = true, + }; + + ctx.BulkInsert(new RenamedParent[] { parent }); + + Assert.AreEqual(1, ctx.RenamedParents.Count()); + } + } + + [Test] + public void BulkInsertChild_RenamedParentExists_OneRowInserted() + { + using (var ctx = GetContext()) + { + var parent = new RenamedParent() + { + ID = 1, + Number = "1", + IsEmpty = true, + }; + ctx.RenamedParents.Add(parent); + ctx.SaveChanges(); + + var child = new RenamedChild() + { + ID = 1, + CreateDate = DateTime.Now, + }; + + ctx.BulkInsert(new RenamedChild[] { child }); + + Assert.AreEqual(1, ctx.RenamedParents.Count()); + Assert.AreEqual(1, ctx.RenamedChilds.Count()); + } + } + + [Test] + public void BulkInsertRenamedChild_RenamedParentNotExists_OneRowInserted() + { + using (var ctx = GetContext()) + { + var child = new RenamedChild() + { + ID = 1, + Number = "1", + IsEmpty = true, + CreateDate = DateTime.Now, + }; + + ctx.BulkInsert(new RenamedChild[] { child }); + + Assert.AreEqual(1, ctx.RenamedParents.Count()); + Assert.AreEqual(1, ctx.RenamedChilds.Count()); + } + } + + [Test] + public void BulkInsertRenamedParentAndChild_TwoTablesUpdated() + { + using (var ctx = GetContext()) + { + var parent = new RenamedParent() + { + ID = 1, + Number = "1", + IsEmpty = true, + }; + + var child = new RenamedChild() + { + ID = 1, + CreateDate = DateTime.Now, + }; + + ctx.BulkInsert(new RenamedParent[] { parent }); + ctx.BulkInsert(new RenamedChild[] { child }); + + Assert.AreEqual(1, ctx.RenamedParents.Count()); + Assert.AreEqual(1, ctx.RenamedChilds.Count()); + } + } + + [SetUp] + public override void Setup() + { + base.Setup(); + using (var ctx = GetContext()) + { + ctx.Database.ExecuteSqlCommand("DELETE FROM [dbo].[Childs]"); + ctx.Database.ExecuteSqlCommand("DELETE FROM [dbo].[Parents]"); + + ctx.Database.ExecuteSqlCommand("DELETE FROM [dbo].[ApChilds]"); + ctx.Database.ExecuteSqlCommand("DELETE FROM [dbo].[AbstractParents]"); + + ctx.Database.ExecuteSqlCommand("DELETE FROM [dbo].[RenamedChild]"); + ctx.Database.ExecuteSqlCommand("DELETE FROM [dbo].[RenamedDocument]"); + } + } +#endif + } +}