none
AEF中Entity的更新问题。 RRS feed

  • 问题

  • 代码如下:
     var query = (from c in context.Customer
                                     where c.CID== customer.CID
                                     select c).FirstOrDefault();
    query = customer;
     int affected = context.SaveChanges();

    affected为0,为什么这样更新不可以更新呢?一定要写成属性的方式来更新才可以更新呢?谢谢!
    2009年2月22日 7:54

答案

  • 请看一下 ObjectContext.ApplyPropertyChanges 方法


    宠辱不惊,看庭前花开花落。 去留无意,望天上云卷云舒。
    • 已标记为答案 CSQ333 2009年3月1日 7:50
    2009年2月28日 9:34
    版主

全部回复

  • 楼主,你好

    试过context.SubmitChanges()吗?

    Microsoft Online Community Support
    2009年2月24日 6:49
  • 实在不知道lz你是要做什么  

    你的动作是把一个查询的指针  用别的查询指针覆盖   本身不会产生任何数据上下文的变化
    就算首页不能显示30天内排行榜 回答总数也快接近top10了 5555
    努力奋斗 重回首页排行榜!!! 55555
    有原则的回答问题: 不懂的不去装懂,别人回答得很完整的,没有需要补充的不去蹭分。
    2009年2月24日 8:44
  • 我就是想把查询出来的记录更新,但是字段太多,一个个字段更新太麻烦了。所以想到用实体更新的办法,但是无法更新。那像我所说的更新应该如何操作呢?
    2009年2月28日 8:12
  • 请看一下 ObjectContext.ApplyPropertyChanges 方法


    宠辱不惊,看庭前花开花落。 去留无意,望天上云卷云舒。
    • 已标记为答案 CSQ333 2009年3月1日 7:50
    2009年2月28日 9:34
    版主
  • 谢谢,这个方法可行!
    但是还有一个问题我想请教一下。
    比如说,CustomerEntity中有一个AddressEntity,那么我在更新的时候如果一起更新AddressEntity这个相关联的实体?
    因为以前在LINQ中并不是使用实体的,而是会有一个AddressId的,但现在为什么是一个实体了?我应该如何更新这个AddressId呢?谢谢!
    2009年3月1日 7:53
  • 试一下 先把新的AddressEntity Select出来然后赋给CustomerEntity的Address属性~再更新CustomerEntity
    宠辱不惊,看庭前花开花落。 去留无意,望天上云卷云舒。
    2009年3月1日 9:48
    版主
  • Snowdream,谢谢你的答复。但是我现在遇到这样的一错误:

    {System.InvalidOperationException: 无法将此对象添加到 ObjectStateManager,因为它已有一个 EntityKey。应使用 ObjectContext.Attach 附加已有一个键的对象。”

    我是这样写的:
    addressEntity = new AddressEntity();
    addressEntity.AddressName = "Street 1";

    customer.AddressEntity = addressEntity;

    然后context.AddToCustomer(customer);

    同时,我试过用Attach(customer);提示“System.InvalidOperationException: 无法将具有 null EntityKey 值的对象附加到对象上下文。
       在 System.Data.Objects.ObjectContext.Attach(IEntityWithKey entity)”。
    请问我该如何做?谢谢!

    2009年3月3日 8:35
  • customer.AddressEntity = addressEntity; 
    这一句可能需要使用
    customer.AddressEntityReference.Attach(addressEntity); 
    如果直接用原来那句,addressEntity的状态好像是会被自动设置成added的,在提交修改时由于它已经有EntityKey,无法再增加到数据库,所以就报错了的~
    宠辱不惊,看庭前花开花落。 去留无意,望天上云卷云舒。
    2009年3月3日 9:08
    版主
  •  
    Snowdream 说:

    customer.AddressEntity = addressEntity; 
    这一句可能需要使用
    customer.AddressEntityReference.Attach(addressEntity); 
    如果直接用原来那句,addressEntity的状态好像是会被自动设置成added的,在提交修改时由于它已经有EntityKey,无法再增加到数据库,所以就报错了的~
    宠辱不惊,看庭前花开花落。去留无意,望天上云卷云舒。



    Snowdream: 我采用你说的代码做的,但是还是发生这样的提示:
    “当与此相关端关联的源对象处于 added、deleted 或 detached 状态时,附加操作不是有效操作。使用 NoTracking 合并选项加载的对象总是处于 detached 状态。”
    2009年3月4日 2:38
  • 又看了一下~这两句

    addressEntity = new AddressEntity();  
    addressEntity.AddressName = "Street 1"


    这个addressEntity如果在数据库中已经存在~需要先从数据库中select出来~不要自己去新建~如果数据库中没有~可以自己新建~然后一起提交~


    宠辱不惊,看庭前花开花落。 去留无意,望天上云卷云舒。
    2009年3月4日 2:50
    版主
  • Snowdream 说:

    又看了一下~这两句

    addressEntity = new AddressEntity();  
    addressEntity.AddressName = "Street 1"


    这个addressEntity如果在数据库中已经存在~需要先从数据库中select出来~不要自己去新建~如果数据库中没有~可以自己新建~然后一起提交~


    宠辱不惊,看庭前花开花落。去留无意,望天上云卷云舒。



    这个数据是一个实体数据,是通过SELECT出来的。
    会不会是因为我是把这个SELECT出来的实体转到另外一个窗体中赋值给该窗体中的的addressEntity变量所导致的呢?
    2009年3月4日 2:58
  • addressEntity = new AddressEntity();  
    这一句不是已经是新的实例了吗?
    如果是2个窗提中只要他们是同一个dataContext就可以了
    宠辱不惊,看庭前花开花落。 去留无意,望天上云卷云舒。
    2009年3月4日 3:05
    版主
  • 我是已经new了这个实体了。而且context也是同一个的,都放在DAL中的,但就是依然出现这样的错误。真是不明白。
    2009年3月5日 8:43
  • new这里是不需要的~这个实体要从数据库中select出来
    不知道有没有正确理解你的意思~
    宠辱不惊,看庭前花开花落。 去留无意,望天上云卷云舒。
    2009年3月5日 9:43
    版主
  • 代码如下:
     var query = (from c in context.Customer
                                     where c.CID== customer.CID
                                     select c).FirstOrDefault();
    query = customer;
     int affected = context.SaveChanges();

    affected为0,为什么这样更新不可以更新呢?一定要写成属性的方式来更新才可以更新呢?谢谢!
           Customer query = context.Customer.First(c => c.CID== customer.CID); 
           context.ApplyPropertyChanges("Customer", customer);
           context.SaveChanges();

    这样试试看。
    2009年6月5日 6:12
  • 谢谢,这个已经解决了!
    2009年6月5日 6:34
  • 对不起,我还没解决,能分享一下你的解决方案吗?
    2010年2月1日 2:47