简体   繁体   中英

Entity Framework 4.0 Update POCO relationship

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

Unfortunately, I had to add the ParentId (or whatever is the name of the column) property to make it work. I know it sucks, but I didn't figure it out other way.

So, change the property and null the parent property, attach the instance to the context, mark it as modified and call SaveChanges() ; and that's it.

IMO, this should be resolved by EF. I use EntityTypeConfiguration for each Class<->Table Mapping in order to keep the database and classes standard unchanged, so it should be straight forward to know that what I marked as primary key is what the EF must use.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM