实体框架4.0更新POCO关系

时间:2010-12-06 10:45:28

标签: c# entity-framework

我创建了POCO类,它在edmx文件中是等效的(只有单向导航属性Parent的Category实体)

public class Category {
    public int ID {get;set;}
    public string Name {get;set;}
    public Category Parent {get;set;}
} 

我对影响Parent属性的CRUD操作有一个问题:

检索看起来像:

public void CanRetrieve() {
var category = context.Categories.Where(x => x.ID == id).FirstOrDefault();
cotext.LoadProperty<Category> (category, c => c.Parent);

}

ant工作正常(我得到填充了Parent属性的Category对象)

添加如下:

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();
}

工作正常(在DB新记录中显示,Parent_ID字段设置为12)

并更新:

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()
}

做任何事情。如果我用以下行替换// XXX行:

Context.ObjectStateManager.ChangeObjectState(cat, EntityState.Modified); 

从源对象更新Name属性的值(我猜其他标量属性也是如此)但忽略Parent并保留基础中的Parent_ID字段。

我的问题是:在这种情况下我如何告诉上下文我希望Parent属性值也反映到数据库中,并且可以在不传递Parent属性的所有值的情况下完成(只有ID,就像添加方案一样) )?

致以最诚挚的问候,

安杰伊

2 个答案:

答案 0 :(得分:0)

你真的确定你的CanAdd代码真的有效吗?您将两个新对象附加到上下文,这意味着它们处于未更改状态。通过调用SaveChanges,不应插入它们。如果您使用AddObject而不是Attach,则新的和父类别将设置为Added状态,并且两者都将插入SaveChanges。

您的CanUpdate方法不起作用,因为您只是将更新的类别设置为已修改状态,但您附加了三个对象 - 类别,父类别以及它们之间的关系。你还必须改变关系的状态。

答案 1 :(得分:0)

不幸的是,我不得不添加ParentId(或列的名称)属性以使其工作。我知道这很糟糕,但我没有想到其他方式。

因此,更改属性并将父属性置空,将实例附加到上下文,将其标记为已修改并调用SaveChanges();就是这样。

IMO,这应该由EF解决。我为每个Class&lt; - &gt;表映射使用EntityTypeConfiguration以保持数据库和类标准不变,因此应该直接知道我标记为主键的是EF必须使用的内容。 / p>