none
如何用LINQ更新主从表?所有方法都用了还是不行。 RRS feed

  • 问题

  • 错误提示:“An entity can only be attached as modified without original state if it declares a version member or does not have an update check policy.”
    1.首先我是在UI层把PurchaseOrder读取,然后做了修改。
    2. 然后还是在UI层,把PurchaseOrderDetails也做了修改,这个修改有可能是ADD,EDIT,DELETE,然后再用purchaseOrder.PurchaseOrderDetails.Add(p);的方法把从表附加到主表中的。
    3. 然后提交。
    4. 处理数据:我已经在purchaseorderdetail表中加了一个Version的timestamp字段
    private bool update(PurchaseOrder po)
    {
       DataContext context = new DataContext(ConnString());
       context.GetTable<PurchaseOrder>().Attach(po, true);
       context.SubmitChanges(); 会提示:“An entity can only be attached as modified without original state if it declares a version member or does not have an update check policy.”

    如果把上面context.GetTable<PurchaseOrder>().Attach(po, true); 换成
    PurchaseOrder purchaseOrder;
     purchaseOrde = context.PurchaseOrder.Single(p => p.PurchaseOrderID == po.PurchaseOrderID);
    context.PurchaseOrders.Attach(po, purchaseOrder);如果换成这样写的话会提示An attempt has been made to Attach or Add an entity that is not new, perhaps having been loaded from another DataContext.  This is not supported.
    还有主键已经存在什么的,种种错误,我找了好多种方法,都不行


    }


    哪位专家帮帮我怎么做?其他就都好了就差这个做不好了,被老板骂死了!!!哪位帮帮忙!!!!
    2009年5月14日 1:41

全部回复

  • 我只用过 entity framework
    似乎从原来的context 得到数据实体后  必须 detatch一次才可以在别的context 更新  否则 add 会报错

    也就是说 产生数据后要detatch 以后才能传递给ui

    不知道是不是这个问题
      


    有效回复过700 撒花
    2009年5月14日 1:54
  • 谢谢回复!您是指在数据读取到UI的时候呢?还是提交到数据层的时候要DETACH?

    2009年5月14日 1:56
  • DBML好像没有DETACH的

    2009年5月14日 1:58
  • 我再看看 l2sql  :P
    有效回复过700 撒花
    2009年5月14日 4:46
  • 仔细地看了下你的代码   你每次都是从一个context 把这个object 取出来  再attach 进去同一个context

    可是   在context 没有销毁的这段时间内   object 已经存在在这个context 的上下文中了 所以出错

    您直接把attach 那一句去掉 似乎就可以不出错了


    有效回复过700 撒花
    2009年5月14日 4:55
  • 我试着在把
    context.PurchaseOrders.Attach(po, purchaseOrder);这句改成:
    DataContext updateContext = new DataContext();
    updateContext.Attach(po, PurchseOrder);
    updateContext.SubmitChanges();

    这些都没有错误了,但是我去SQL看了一下,数据还是没有真正的UPDATE到数据库中。
    请问我这样做是不是哪里又错了?
    2009年5月14日 5:02
  • 我现在发现,是我从UI层传入的purchaseOrder的原因,因为我刚才上面说好了是把传入的purchaseOrder用代码克隆了一个,就好了,但是如果用传入的还是会出现原来的错误。克隆出来的是无法更新新数据的,但是不会报错了。DBML真不知道如何DETACH。
    2009年5月14日 5:08
  • 发现了一章专题  

    http://msdn.microsoft.com/zh-cn/library/bb546187.aspx

    一起学习一下
    有效回复过700 撒花
    2009年5月14日 5:42
  • 还是不行啊,您可不可以根据ado.net entity framework的写法帮我写一下?我再研究一下。谢谢!

    2009年5月14日 5:44