I have created the POCO class and it’s equivalent in edmx file (Category entity with only one way navigation property Parent)
public class Category {
public int ID {get;set;}
public string Name {get;set;}
public Category Parent {get;set;}
}
And I have an issue with CRUD operations affecting Parent property:
Retrieve looks like:
public void CanRetrieve() {
var category = context.Categories.Where(x => x.ID == id).FirstOrDefault();
cotext.LoadProperty<Category> (category, c => c.Parent);
}
ant is working fine (i get Category object with Parent property filled)
Add looks like:
public void CanAdd() {
Category cat = new Category();
cat.Name = "cat 1";
cat.Parent = new Category() {ID = 12}; //assuming that in the database there is a record with ID 12
context.Categories.Attach(cat);
context.SaveChanges();
}
Is also working fine (in the DB new record appears with Parent_ID field set to 12)
And Update:
public void CanUpdate() {
Category cat = new Category();
cat.Name = "cat 1";
cat.Parent = new Category() {ID = 12}; //assuming that in the database there is a record with ID 12
context.Categories.Attach(cat);
//XXX
context.SaveChanges()
}
does anything. If I replace the //XXX line with the following line:
Context.ObjectStateManager.ChangeObjectState(cat, EntityState.Modified);
the value of Name property is updated form the source object (I guess other scalar properties would also be) but the Parent is ignored and the Parent_ID field in the base is preserved.
My question is: How in this scenario can I tell the context I want the Parent property value also reflected to the database and can it be done without passing all the values of Parent property (only an ID, just like in Adding scenario)?
Best regards,
Andrzej
Are you really sure that your CanAdd code really works? You are attaching two new objects to context which means that they are in unchanged state. By calling SaveChanges they should not be inserted. If you use AddObject instead of Attach both new and parent categories will be set to Added state and both will be inserted in SaveChanges.
Your CanUpdate method doesn’t work because you are just setting updated category to modified state but you have attached three objects – category, parent category and relations between them. You also have to change state of the relation.