public void InferredAdd_EntityRefs() { NorthwindEntityContainer ec = new NorthwindEntityContainer(); // add a few existing entities Order order1 = new Order { OrderID = 1 }; Order_Detail detail1 = new Order_Detail { OrderID = 2, ProductID = 1 }; ec.LoadEntities(new Entity[] { order1, detail1 }); ((IChangeTracking)ec).AcceptChanges(); Assert.IsFalse(ec.HasChanges); // build a detached graph of a new category and 2 products Category newCategory = new Category { CategoryID = 1 }; Product newProduct1 = new Product { ProductID = 3 }; Product newProduct2 = new Product { ProductID = 4 }; newCategory.Products.Add(newProduct1); newCategory.Products.Add(newProduct2); // set the the Product reference on the existing detail to // one of the new detached products - we expect the entire // graph to be infer added EntityChangeSet cs = ec.GetChanges(); Assert.IsTrue(cs.IsEmpty); detail1.Product = newProduct1; cs = ec.GetChanges(); Assert.AreEqual(3, cs.AddedEntities.Count); Assert.IsTrue(cs.AddedEntities.Contains(newProduct1)); // the entity set directly Assert.IsTrue(cs.AddedEntities.Contains(newCategory)); // inferred via Product.Category ER Assert.IsTrue(cs.AddedEntities.Contains(newProduct2)); // inferred via Category.Products EC // verify that inferred Adds can be state transitioned via subsequent // calls to Attach ec.GetEntitySet<Product>().Attach(newProduct2); newProduct2.ProductName += "x"; cs = ec.GetChanges(); Assert.AreEqual(2, cs.AddedEntities.Count); Assert.AreEqual(2, cs.ModifiedEntities.Count); Assert.IsFalse(cs.AddedEntities.Contains(newProduct2)); Assert.IsTrue(cs.ModifiedEntities.Contains(newProduct2)); }
public void TestAssociations_UpdatedReferencingNew() { NorthwindEntityContainer ec = new NorthwindEntityContainer(); Product p1 = new Product { ProductID = 1, CategoryID = 1 }; Product p2 = new Product { ProductID = 2, CategoryID = 2 }; Category c1 = new Category { CategoryID = 1 }; Category c2 = new Category { CategoryID = 2 }; ec.LoadEntities(new Entity[] { p1, p2, c1, c2 }); // take two existing parents (the FK side of the association) // access their existing children Category prevCat = p1.Category; Assert.IsNotNull(prevCat); prevCat = p2.Category; Assert.IsNotNull(prevCat); // create two new children Category newCat1 = new Category { CategoryID = 3 }; Category newCat2 = new Category { CategoryID = 4 }; // assign the two new children p1.Category = newCat1; p2.Category = newCat2; EntityChangeSet cs = ec.GetChanges(); Assert.AreEqual(2, cs.AddedEntities.Count); Assert.AreEqual(2, cs.ModifiedEntities.Count); List<ChangeSetEntry> entries = ChangeSetBuilder.Build(cs); ChangeSetEntry entry = entries.Single(p => p.Entity == p1); // the bug was that we weren't populating the association map in this // scenario since previously we required BOTH parent and child to be new. // We've relaxed that to ensure that if the child is new, the association // shows up in the map. Assert.IsNotNull(entry.Associations); int[] ids = entry.Associations["Category"]; Category referenced = (Category)entries.Single(p => p.Id == ids.Single()).Entity; Assert.AreSame(newCat1, referenced); }
public void InferredAdd_EntityCollection() { NorthwindEntityContainer ec = new NorthwindEntityContainer(); // add a few existing entities Order order1 = new Order { OrderID = 1 }; Order order2 = new Order { OrderID = 2 }; Order_Detail detail1 = new Order_Detail { OrderID = 2, ProductID = 1 }; ec.LoadEntities(new Entity[] { order1, order2, detail1 }); ((IChangeTracking)ec).AcceptChanges(); Assert.IsFalse(ec.HasChanges); // build a detached graph of a new category and 2 products, // referenced by a detail Order_Detail newDetail1 = new Order_Detail { OrderID = 1, ProductID = 2 }; Category newCategory = new Category { CategoryID = 1 }; Product newProduct1 = new Product { ProductID = 3 }; Product newProduct2 = new Product { ProductID = 4 }; newCategory.Products.Add(newProduct1); newCategory.Products.Add(newProduct2); newDetail1.Product = newProduct1; EntityChangeSet cs = ec.GetChanges(); Assert.IsTrue(cs.IsEmpty); // verify that adding an unattached entity to an EC results in // the expected inferred Adds order1.Order_Details.Add(newDetail1); cs = ec.GetChanges(); Assert.AreEqual(4, cs.AddedEntities.Count); Assert.IsTrue(cs.AddedEntities.Contains(newDetail1)); // the entity added directly Assert.IsTrue(cs.AddedEntities.Contains(newProduct1)); // inferred via Detail.Product ER Assert.IsTrue(cs.AddedEntities.Contains(newCategory)); // inferred via Product.Category ER Assert.IsTrue(cs.AddedEntities.Contains(newProduct2)); // inferred via Category.Products EC // verify that inferred Adds can be state transitioned via subsequent // calls to Attach ec.GetEntitySet<Product>().Attach(newProduct2); newProduct2.ProductName += "x"; cs = ec.GetChanges(); Assert.AreEqual(3, cs.AddedEntities.Count); Assert.AreEqual(1, cs.ModifiedEntities.Count); Assert.IsFalse(cs.AddedEntities.Contains(newProduct2)); Assert.IsTrue(cs.ModifiedEntities.Contains(newProduct2)); }
partial void DeleteCategory(Category instance);
partial void UpdateCategory(Category instance);
partial void InsertCategory(Category instance);
private bool FilterCategory(Category entity) { return (entity.CategoryID == this.CategoryID); }