【问题标题】:Entity Framework 4.0 Update POCO relationshipEntity Framework 4.0 更新 POCO 关系
【发布时间】:2010-12-06 10:45:27
【问题描述】:

我已经创建了 POCO 类,它在 edmx 文件中是等价的(只有一种方式导航属性父级的类别实体)

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

我对影响父属性的 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,就像在添加场景中一样)?

最好的问候,

安德烈

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

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

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

    【讨论】:

    • 你说得对,我有点匆忙地编写代码,所以我不小心将 Attach 而不是 AddObject 放到 CanAdd 方法中。很抱歉造成误导。至于 CanUpdate,据我了解,我无法将关系状态设置为已修改,这是否意味着在我的场景中我必须删除旧关系(将其更改为已删除),然后放置新的父实体并将关系设置为已添加)?跨度>
    • 我猜是的,因为关系是由相关实体定义的。
    • 我有同样的问题,但我不知道如何改变 relation 的状态。可以举个例子吗?
    【解决方案2】:

    不幸的是,我必须添加 ParentId(或任何列的名称)属性才能使其工作。我知道这很糟糕,但我没有其他办法。

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

    IMO,这应该由 EF 解决。我为每个 ClassTable Mapping 使用EntityTypeConfiguration,以保持数据库和类标准不变,因此应该直接知道我标记为主键的是 EF 必须使用的。

    【讨论】:

      猜你喜欢
      • 2018-11-24
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 2011-01-06
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多