【问题标题】:Linq2SQL: Update object not created in datacontextLinq2SQL:更新未在数据上下文中创建的对象
【发布时间】:2008-12-16 14:20:41
【问题描述】:

通常当您在 linq2sql 中更新对象时,您会从 datacontext 中获取对象并使用相同的 datacontext 来保存对象,对吧?

更新您用于执行保存操作的数据上下文尚未检索的对象的最佳方法是什么,即我正在使用 florinefx 在 flex 和 asp.net 之间传递数据以及当对象从要保存的客户端我不知道如何保存对象?

   public static void Save(Client client)
    {
        CompanyDataContext db = new CompanyDataContext();
        Validate(client);
        if(client.Id.Equals(Guid.Empty))
        {
            //Create (right?):
            client.Id = Guid.NewGuid();
            db.Clients.InsertOnSubmit(client);
            db.SubmitChanges();
        }
        else
        {
            //Update:
            OffertaDataContext db = new OffertaDataContext();
            db.Clients.????

        }
    }

更新:在这种情况下,使用 Attach 的不同方法不起作用。所以我想需要一种基于反射的方法。

【问题讨论】:

    标签: c# asp.net linq-to-sql


    【解决方案1】:

    要更新现有但断开连接的对象,您需要将其“附加”到数据上下文中。这将重新使用现有的主键等。您可以控制如何处理更改 - 即视为脏,或视为干净并跟踪未来的更改等。

    Attach 方法在桌面上 - 即

    ctx.Customers.Attach(customer); // optional bool to treat as modified
    

    【讨论】:

    【解决方案2】:

    我认为你有两个选择:

    1) 将对象附加到您将在其上进行保存的 DataContext 2)使用对象上的主键,获取附加到上下文的实例(例如,执行 FirstOrDefault()),然后将数据从修改后的对象复制到具有上下文的对象(反射可能有用在这里)。

    Rick Strahl 在http://www.west-wind.com/weblog/posts/134095.aspx 上有一篇关于将实体附加到上下文的非常好的博客文章,特别是关于您可能遇到的一些问题。

    【讨论】:

      【解决方案3】:

      我希望你能提供帮助。我正在使用 Linq to Sql 开发一个分层网站。我在 DBML 设计器中创建了一个名为 memberState 的新类(或对象)。此对象不是数据库中的实际表。我的中间层有这个方法:

      public override IEnumerable(memberState) GetMembersByState(string @state)<br/>
      {<br/>
      using (BulletinWizardDataContext context = DataContext)<br/>
      {<br/>
      IEnumerable(memberState) mems = (from m in context.Members<br/>
      join ma in context.MemberAddresses<br/>
      on m.UserId equals ma.UserId<br/>
      join s in context.States<br/>
      on ma.StateId equals s.StateId<br/>
      where s.StateName == @state<br/>
      select new memberState<br/>
      {<br/>
      userId = m.UserID,<br/>
      firstName = m.FirstName,<br/>
      middleInitial = m.MiddleInitial,<br/>
      lastName = m.LastName,<br/>
      createDate = m.CreateDate,<br/>
      modifyDate = m.ModifyDate<br/>
      }).ToArray(memberState)();<br/>
      return mems;
      }
      }
      

      我的联接中的表(Members、States 和 MemberAddresses 是我数据库中的实际表)。我创建了对象 memberStates,因此我可以在上面的查询中使用它(注意 Select New memberState。当网页上的数据更新时,如何将更改保留回成员表?我的成员表由以下列组成:UserId、FirstName、MiddleInitial、LastName、CreateDate、ModifyDate。我不确定如何将更改保存回数据库。

      谢谢,

      【讨论】:

      • 为什么不在 SO 上创建一个它自己的问题呢?这样你会得到更好的答案!无论如何......当你持久化你的数据时,你需要获取成员并使用你的成员状态实例中更改的值并更新它。
      猜你喜欢
      • 2011-05-22
      • 2019-07-20
      • 2012-07-30
      • 2012-09-29
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多