我创建了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,就像添加方案一样) )?
致以最诚挚的问候,
安杰伊
答案 0 :(得分:0)
你真的确定你的CanAdd代码真的有效吗?您将两个新对象附加到上下文,这意味着它们处于未更改状态。通过调用SaveChanges,不应插入它们。如果您使用AddObject而不是Attach,则新的和父类别将设置为Added状态,并且两者都将插入SaveChanges。
您的CanUpdate方法不起作用,因为您只是将更新的类别设置为已修改状态,但您附加了三个对象 - 类别,父类别以及它们之间的关系。你还必须改变关系的状态。
答案 1 :(得分:0)
不幸的是,我不得不添加ParentId(或列的名称)属性以使其工作。我知道这很糟糕,但我没有想到其他方式。
因此,更改属性并将父属性置空,将实例附加到上下文,将其标记为已修改并调用SaveChanges()
;就是这样。
IMO,这应该由EF解决。我为每个Class&lt; - &gt;表映射使用EntityTypeConfiguration
以保持数据库和类标准不变,因此应该直接知道我标记为主键的是EF必须使用的内容。 / p>