public void TestSaveSimpleCollection()
        {
            int empKey = -1;
            EmployeeCollection empColl = new EmployeeCollection();
            empColl.es.Connection.Name = "ForeignKeyTest";
            Employee emp = new Employee();
            emp.es.Connection.Name = "ForeignKeyTest";

            try
            {
                using (esTransactionScope scope = new esTransactionScope())
                {
                    empColl.LoadAll();
                    emp = empColl.AddNew();
                    emp.LastName = "LastName";
                    emp.FirstName = "FirstName";

                    Order ord = emp.OrderCollectionByEmployeeID.AddNew();
                    ord.CustID = "10001";
                    ord.CustSub = "001";
                    ord.str().OrderDate = "2007-01-01 00:00:00";

                    empColl.Save();
                    empKey = emp.EmployeeID.Value;

                    Assert.AreEqual(1, emp.OrderCollectionByEmployeeID.Count);
                    Assert.AreEqual(emp.EmployeeID.Value, ord.EmployeeID.Value);
                }
            }
            finally
            {
                // Clean up
                emp = new Employee();
                emp.es.Connection.Name = "ForeignKeyTest";

                if (emp.LoadByPrimaryKey(empKey))
                {
                    OrderCollection ordColl = emp.OrderCollectionByEmployeeID;
                    ordColl.MarkAllAsDeleted();
                    emp.MarkAsDeleted();
                    emp.Save();
                }
            }
        }
        public void SerializeDeserializeProxyStubCollection()
        {
            if (aggTest.es.Connection.Name == "SqlCe")
            {
                Assert.Ignore("Not tested for SqlCe.");
            }
            else
            {
                // Load all 5 Employees
                EmployeeCollection collection = new EmployeeCollection();
                collection.es.Connection.Name = "ForeignKeyTest";

                collection.LoadAll();

                // Create a Proxy and Serialize into a string named "Packet"
                EmployeeCollectionProxyStub proxy =
                    new EmployeeCollectionProxyStub(collection);

                XmlSerializer sf =
                    new XmlSerializer(typeof(EmployeeCollectionProxyStub));
                StringWriter sw = new StringWriter();
                sf.Serialize(sw, proxy);

                string packet = sw.ToString();

                // Now let's DeSerialize it
                XmlSerializer xs =
                    new XmlSerializer(typeof(EmployeeCollectionProxyStub));
                StringReader sr = new StringReader(packet);

                proxy = xs.Deserialize(sr) as EmployeeCollectionProxyStub;

                // Count should = 5
                Assert.AreEqual(5, proxy.GetCollection().Count);
                Assert.AreEqual("Smith", proxy.Collection[0].LastName);
            }
        }
        public void ErrorsWithContinueTrueNoFailures()
        {
            EmployeeCollection coll = new EmployeeCollection();
            coll.es.Connection.Name = "ForeignKeyTest";
            coll.LoadAll();
            Assert.AreEqual(5, coll.Count, "Initial Load");

            using (esTransactionScope scope = new esTransactionScope())
            {
                // INSERT will succeed
                Employee emp5 = coll.AddNew();
                emp5.FirstName = "First5";
                emp5.LastName = "Last5";

                coll.Save(true);

                Assert.AreEqual(0, coll.Errors.Count(), "ErrorsCount");
                Assert.IsNull(coll.es.DeletedEntities, "DeletedErrors");

                // Confirm only 1 row got INSERTed
                EmployeeCollection coll2 = new EmployeeCollection();
                coll2.es.Connection.Name = "ForeignKeyTest";
                coll2.LoadAll();
                Assert.AreEqual(6, coll2.Count, "Load");

                // Confirm auto-incremeting PKs are brought back
                // and delete the successfully inserted row
                int emp5Id = emp5.EmployeeID.Value;
                Employee emp5Ins = new Employee();
                emp5Ins.es.Connection.Name = "ForeignKeyTest";

                Assert.IsTrue(emp5Ins.LoadByPrimaryKey(emp5Id), "LoadByPK2");
                emp5Ins.MarkAsDeleted();
                emp5Ins.Save();
            }
        }
        public void ErrorsWithContinueTrueDel()
        {
            EmployeeCollection coll = new EmployeeCollection();
            coll.es.Connection.Name = "ForeignKeyTest";
            coll.LoadAll();
            Assert.AreEqual(5, coll.Count, "Initial Load");

            using (esTransactionScope scope = new esTransactionScope())
            {
                // SQLite does not enforce FK constraints
                // So force a concurrency failure instead
                if (coll.es.Connection.ProviderSignature.DataProviderName
                    == "EntitySpaces.SQLiteProvider")
                {
                    Employee empConcurr = new Employee();
                    empConcurr.es.Connection.Name = "ForeignKeyTest";
                    empConcurr.LoadByPrimaryKey(2);
                    empConcurr.MarkAsDeleted();
                    empConcurr.Save();
                }

                // DELETE will fail - FK constraint
                Employee emp4 = coll.FindByPrimaryKey(2);
                emp4.MarkAsDeleted();

                coll.Save(true);

                Assert.AreEqual(1, coll.Errors.Count(), "ErrorsCount");
                Assert.IsNotNull(coll.es.DeletedEntities, "DeletedErrors");

                foreach (Employee e in coll.Errors)
                {
                    Assert.IsTrue(e.es.RowError.Length > 0);
                }

                if (coll.es.Connection.ProviderSignature.DataProviderName
                    != "EntitySpaces.SQLiteProvider")
                {
                    // Confirm same table row count
                    EmployeeCollection coll2 = new EmployeeCollection();
                    coll2.es.Connection.Name = "ForeignKeyTest";
                    coll2.LoadAll();
                    Assert.AreEqual(5, coll2.Count, "Load");

                    // Confirm nothing got DELETEd
                    Employee empDel = new Employee();
                    empDel.es.Connection.Name = "ForeignKeyTest";
                    Assert.IsTrue(empDel.LoadByPrimaryKey(2), "Delete");
                }
            }
        }
        public void ErrorsWithContinueTrueInsUpdDel()
        {
            EmployeeCollection coll = new EmployeeCollection();
            coll.es.Connection.Name = "ForeignKeyTest";
            coll.LoadAll();
            Assert.AreEqual(5, coll.Count, "Initial Load");

            using (esTransactionScope scope = new esTransactionScope())
            {
                // SQLite does not enforce FK constraints
                // So force a concurrency failure instead
                if (coll.es.Connection.ProviderSignature.DataProviderName
                    == "EntitySpaces.SQLiteProvider")
                {
                    Employee empConcurr = new Employee();
                    empConcurr.es.Connection.Name = "ForeignKeyTest";
                    empConcurr.LoadByPrimaryKey(2);
                    empConcurr.MarkAsDeleted();
                    empConcurr.Save();
                }

                // INSERT will succeed
                Employee emp1 = coll.AddNew();
                emp1.FirstName = "First1";
                emp1.LastName = "Last1";

                // INSERT will fail - LastName required
                Employee emp2 = coll.AddNew();

                // UPDATE will fail - LastName required
                Employee emp3 = coll.FindByPrimaryKey(1);
                emp3.LastName = null;

                // DELETE will fail - FK constraint
                Employee emp4 = coll.FindByPrimaryKey(2);
                emp4.MarkAsDeleted();

                // INSERT will succeed
                Employee emp5 = coll.AddNew();
                emp5.FirstName = "First5";
                emp5.LastName = "Last5";

                coll.Save(true);

                Assert.AreEqual(3, coll.Errors.Count(), "ErrorsCount");
                Assert.IsNotNull(coll.es.DeletedEntities, "DeletedErrors");

                foreach (Employee e in coll.Errors)
                {
                    Assert.IsTrue(e.es.RowError.Length > 0);
                }

                // Confirm only 2 rows got INSERTed
                EmployeeCollection coll2 = new EmployeeCollection();
                coll2.es.Connection.Name = "ForeignKeyTest";
                coll2.LoadAll();
                if (coll.es.Connection.ProviderSignature.DataProviderName
                    == "EntitySpaces.SQLiteProvider")
                {
                    Assert.AreEqual(6, coll2.Count, "Load");
                }
                else
                {
                    Assert.AreEqual(7, coll2.Count, "Load");

                    // Confirm nothing got DELETEd
                    Employee empDel = new Employee();
                    empDel.es.Connection.Name = "ForeignKeyTest";
                    Assert.IsTrue(empDel.LoadByPrimaryKey(2), "Delete");
                }

                // Confirm nothing got UPDATEd
                Employee empUpd = new Employee();
                empUpd.es.Connection.Name = "ForeignKeyTest";
                Assert.IsTrue(empUpd.LoadByPrimaryKey(1));
                Assert.AreEqual("Smith", empUpd.LastName, "Update");

                // Confirm auto-incremeting PKs are brought back
                // and delete the 2 successfully inserted rows
                int emp1Id = emp1.EmployeeID.Value;
                Employee emp1Ins = new Employee();
                emp1Ins.es.Connection.Name = "ForeignKeyTest";

                Assert.IsTrue(emp1Ins.LoadByPrimaryKey(emp1Id), "LoadByPK1");
                emp1Ins.MarkAsDeleted();
                emp1Ins.Save();

                int emp5Id = emp5.EmployeeID.Value;
                Employee emp5Ins = new Employee();
                emp5Ins.es.Connection.Name = "ForeignKeyTest";

                Assert.IsTrue(emp5Ins.LoadByPrimaryKey(emp5Id), "LoadByPK2");
                emp5Ins.MarkAsDeleted();
                emp5Ins.Save();
            }
        }
        public void ErrorsWithContinueDefaultFalse()
        {
            EmployeeCollection coll = new EmployeeCollection();
            coll.es.Connection.Name = "ForeignKeyTest";
            coll.LoadAll();
            Assert.AreEqual(5, coll.Count, "Initial Load");

            using (esTransactionScope scope = new esTransactionScope())
            {
                try
                {
                    // INSERT would succeed
                    // but should rollback by default
                    Employee emp1 = coll.AddNew();
                    emp1.FirstName = "asdf";
                    emp1.LastName = "adf";

                    // INSERT will fail - LastName required
                    Employee emp2 = coll.AddNew();

                    // UPDATE will fail - LastName required
                    Employee emp3 = coll.FindByPrimaryKey(1);
                    emp3.LastName = null;

                    // DELETE will fail - FK constraint
                    Employee emp4 = coll.FindByPrimaryKey(2);
                    emp4.MarkAsDeleted();

                    coll.Save(false);
                }
                catch (Exception ex)
                {
                    // Save() throws exception on first error encountered
                    Assert.AreEqual(1, coll.Errors.Count(), "ExceptionCount");
                    Assert.IsTrue(ex.ToString().Length > 0, "ExceptionLength");
                }
                finally
                {
                    // Confirm nothing got INSERTed
                    EmployeeCollection coll2 = new EmployeeCollection();
                    coll2.es.Connection.Name = "ForeignKeyTest";
                    coll2.LoadAll();
                    Assert.AreEqual(5, coll2.Count, "LoadInFinally");

                    // Confirm nothing got UPDATEd
                    Employee empUpd = coll2.FindByPrimaryKey(1);
                    Assert.AreEqual("Smith", empUpd.LastName, "Update");

                    // Confirm nothing got DELETEd
                    Employee empDel = new Employee();
                    empDel.es.Connection.Name = "ForeignKeyTest";
                    Assert.IsTrue(empDel.LoadByPrimaryKey(2), "Delete");
                }
            }
        }
        public void CollectionMixedInsUpdDel()
        {
            using (esTransactionScope scope = new esTransactionScope())
            {
                // Setup
                Employee newEmp = new Employee();
                newEmp.es.Connection.Name = "ForeignKeyTest";
                newEmp.LastName = "new";
                newEmp.FirstName = "new";
                newEmp.Save();

                EmployeeCollection coll = new EmployeeCollection();
                coll.es.Connection.Name = "ForeignKeyTest";
                coll.LoadAll();
                Assert.AreEqual(6, coll.Count, "Initial Load");

                // Insert
                Employee emp1 = coll.AddNew();
                emp1.FirstName = "emp1";
                emp1.LastName = "emp1";

                // Update
                Employee emp3 = coll.FindByPrimaryKey(1);
                emp3.LastName = "emp3";

                // Delete
                Employee emp4 = coll.FindByPrimaryKey(newEmp.EmployeeID.Value);
                emp4.MarkAsDeleted();

                coll.Save();

                // Confirm INSERT
                Employee empIns = new Employee();
                empIns.es.Connection.Name = "ForeignKeyTest";
                Assert.IsTrue(empIns.LoadByPrimaryKey(emp1.EmployeeID.Value), "Insert");

                // Confirm UPDATE
                Employee empUpd = new Employee();
                empUpd.es.Connection.Name = "ForeignKeyTest";
                Assert.IsTrue(empUpd.LoadByPrimaryKey(1), "Update");
                Assert.AreEqual("emp3", empUpd.LastName, "UpdateValue");

                // Confirm DELETE
                Employee empDel = new Employee();
                empDel.es.Connection.Name = "ForeignKeyTest";
                Assert.IsFalse(empDel.LoadByPrimaryKey(newEmp.EmployeeID.Value), "Delete");
            }
        }