2010-04-26 51 views
2

以下是典型的,对我来说Update方法L2S。我对这很多(L2S &业务应用程序开发)仍然相当新,但这只是感觉错误。就像那里必须是一个更聪明的方法。不幸的是,我很难想象它,并希望有人能够提供一个例子或指引我朝着正确的方向发展。LINQ to SQL中更好的UPDATE方法

要在黑暗中进行刺探,我是否拥有Person Object,将所有这些字段都作为属性?那么,什么?

这是多余的,因为L2S已经将我的人员表映射到一个类?

这只是“是怎么一回事呢”,你最终结束了传递30个参数(以上)到UPDATE声明在某些时候?

作为参考,这是一个使用C#,WinForms,.Net 3.5和L2S而不是SQL 2005 Standard的商业应用程序。

这是我的典型更新电话。这是在一个文件(BLLConnect.cs)与其他CRUD方法。 连接是持有tblPerson数据库的名称当用户点击save()这就是最终调用所有这些领域具有潜在的,被更新 - >

public static void UpdatePerson(int personID, string userID, string titleID, string firstName, string middleName, string lastName, string suffixID, 
                  string ssn, char gender, DateTime? birthDate, DateTime? deathDate, string driversLicenseNumber, 
                  string driversLicenseStateID, string primaryRaceID, string secondaryRaceID, bool hispanicOrigin, 
                  bool citizenFlag, bool veteranFlag, short ? residencyCountyID, short? responsibilityCountyID, string emailAddress, 
                  string maritalStatusID) 
    { 
     using (var context = ConnectDataContext.Create()) 
     { 
      var personToUpdate = 
       (from person in context.tblPersons 
       where person.PersonID == personID 
       select person).Single(); 

      personToUpdate.TitleID = titleID; 
      personToUpdate.FirstName = firstName; 
      personToUpdate.MiddleName = middleName; 
      personToUpdate.LastName = lastName; 
      personToUpdate.SuffixID = suffixID; 
      personToUpdate.SSN = ssn; 
      personToUpdate.Gender = gender; 
      personToUpdate.BirthDate = birthDate; 
      personToUpdate.DeathDate = deathDate; 
      personToUpdate.DriversLicenseNumber = driversLicenseNumber; 
      personToUpdate.DriversLicenseStateID = driversLicenseStateID; 
      personToUpdate.PrimaryRaceID = primaryRaceID; 
      personToUpdate.SecondaryRaceID = secondaryRaceID; 
      personToUpdate.HispanicOriginFlag = hispanicOrigin; 
      personToUpdate.CitizenFlag = citizenFlag; 
      personToUpdate.VeteranFlag = veteranFlag; 
      personToUpdate.ResidencyCountyID = residencyCountyID; 
      personToUpdate.ResponsibilityCountyID = responsibilityCountyID; 
      personToUpdate.EmailAddress = emailAddress; 
      personToUpdate.MaritalStatusID = maritalStatusID; 
      personToUpdate.UpdateUserID = userID; 
      personToUpdate.UpdateDateTime = DateTime.Now; 

      context.SubmitChanges(); 
     } 
    } 

所以,如果我正确理解事情,我会在我的Winform UI中使用一个datacontext引用,我将在填充字段时使用该引用,还会为UPDATES,INSERTS和DELETES添加引用。正确?

+0

如果你正在更新这种方式,我认为你需要去通过一些MVC教程,如http://nerddinnerbook.s3.amazonaws.com/Intro.htm – 2010-04-26 19:21:31

+0

@Nicholas:这是否适用于非Web应用程序作为好?谢谢。 – 2010-04-26 19:25:04

回答

2

一个DataContext遵循称为工作单元的模式。它会跟踪您在一段代码中执行的所有插入,更新和删除操作。

一旦这段代码完成运行,SubmitChanges方法一次将所有修改发送到数据库。你不需要做任何事情;您所做的更改将自动保留。

+0

再加谢谢你,不要,我需要将新值分配给相应的数据库区域?我觉得我失去了一些东西,每个人都理所当然,它引起了我一个额外的步骤...... – 2010-04-26 19:35:01

+0

通过L2S生成的对象,在这种情况下,'Person',跟踪所有的改变自己。当你写'person.FirstName =“...”'时,'Person'类检测到值已经改变,并且标记*该列*以进行更新。当你调用SubmitChanges时,所有这些对* all *实体的修改都会一次发送到数据库服务器。使用L2S,您不会管理插入,更新和删除自己;相反,你只是对对象采取行动,而更新是隐含的*。 – 2010-04-26 20:03:11

+0

@Bryan Watts:再次感谢您的时间。我仍然不理解。在上述方法中,我不是正在执行您评论的前半部分的内容吗?在我的例子中,我是在管理还是在做一些“错误的”。希望这听起来不会公开......我只是不明白我会做什么不同...谢谢。 – 2010-04-26 20:10:59

4

只是不写这个方法:)

任何时候,一些业务逻辑需要一个人更新特定领域,更新该人的特定字段(记住http之前更新的datacontext上下文被卸载)

当你说“这是多余的,因为L2S已经将我的人员表映射到一个类?”,你是在正确的轨道上。只需使用L2S提供的类:)

如果您有一个(winforms)屏幕需要编辑这个30字段人物,那么最简单的方法就是直接在屏幕上的databind字段将linq上的字段转换为sql的Person对象。下面是一个典型屏幕的生命周期:

  • 您的形式构造(与某人ID)
  • 你的窗体的Load事件处理程序将检索一个Person对象从LINQ到SQL:context.tblPersons.Single(x=>x.ID == personID)
  • 此人将被设置为形式主要BindingSource's数据源
  • 一大堆屏幕上的文本框将被设置为绑定到Person对象上的每个字段,允许用户直接编辑属性(你可以拖动从数据源标签一个DetailsView到你在VS中的表格自动完成这些)
  • 当用户点击保存,只需调用EndEdit中的数据源,然后在L2S DataContext的

的SubmitChanges一切正常,你应该在你的数据库中看到新的价值观......

+0

我的印象是,我正在认真对待错误的事情。不幸的是,我不理解如何更好地做到这一点。那是我现在正在做什么?当说编辑 - >人,然后保存我传回潜在的值来保存。我错过了什么? – 2010-04-26 19:33:11

+0

它可能支付看看借鉴应用,如MVC店面,或斯科特Guthrie的一系列LINQ的职位到SQL在ASP.NET 给我们,当你调用这个方法的一个例子。不要先构建框架,只需完成构建功能所需的最少事情。现在甚至忘了3层;) – 2010-04-26 19:43:50

+0

谢谢,我想我被误解了。此方法位于具有其他tblPerson CRUD方法的Class文件中。在我的winform应用程序中,用户将查看Person,然后单击EDIT,然后SAVE将触发此调用。这些都是tblPerson中的所有字段,可以在一次编辑 - 保存呼叫中由用户更新。当我看着斯科特谷的博客(http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx)或许多其他的网站我看到这个相同'模式'。我的问题只是字段的数量,还是我的教程太过于直接了当? – 2010-04-26 19:48:00

1

有什么不对您的更新方法是,你必须创建在其中一个DataContext实例。

而且我相信你也有其他的CRUD方法,其这样做。

如果你抽象的使用你的CRUD操作,你将使用DataContext的,因为它是意味着库类。

查看这个question的答案,如果你按照设计概述,你只是将一个Person对象传递给存储库Update方法,它不会太笨拙。