c# - LINQ to SQL 中更好的 UPDATE 方法

标签 c# .net linq-to-sql oop

下面是一个典型的,对我来说,L2S 中的 Update 方法。我对其中很多(L2S 和业务应用程序开发)还是很陌生,但这只是感觉不对。就像必须有一种更聪明的方法来做到这一点。不幸的是,我无法想象它,希望有人能提供一个例子或为我指明正确的方向。

为了在黑暗中试一试,我会得到一个将所有这些字段都作为属性的 Person 对象 吗?那又怎样呢?

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

这只是“进展如何”吗,您最终将 30 个参数(或更多)传递给 UPDATE 语句一些点?

作为引用,这是一个使用 C#、WinForms、.Net 3.5 和基于 SQL 2005 标准的 L2S 的商业应用。

这是我的典型更新电话。这是与其他 CRUD 方法在一个文件 (BLLConnect.cs) 中。 Connect 是保存 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 引用,我将在填充字段时使用它,还可以用于更新、插入和删除。正确吗?

最佳答案

只是不要写这个方法:)

任何时候一些业务逻辑需要更新一个人的特定字段,更新那个人的特定字段(并记住在卸载 http 上下文之前更新数据上下文)

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

如果您有一个 (winforms) 屏幕需要编辑这个 30 字段的人员对象,那么最简单的做法是 databind屏幕上的字段直接到 linq to sql 的 Person 对象上的字段。这是一个典型的屏幕生命周期:

  • 您的表单已构建(带有人员 ID)
  • 您的表单的加载事件处理程序将从 Linq 到 Sql 检索一个 Person 对象:context.tblPersons.Single(x=>x.ID == personID)
  • 此人将被设置为表单的主要 BindingSource's数据源
  • 屏幕上的大量文本框将被设置为绑定(bind)到该人物对象的每个字段,允许用户直接编辑属性(您只需将详细信息 View 从数据源选项卡拖到 VS 中的表单上即可自动执行这些操作)
  • 当用户点击保存时,只需在 DataSource 上调用 EndEdit,然后在 L2s Datacontext 上调用 SubmitChanges

一切顺利,您应该在数据库中看到新值...

关于c# - LINQ to SQL 中更好的 UPDATE 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2716174/

相关文章:

c# - 添加 Imap 文件夹 Mailkit

c# - 在自定义控件的嵌套 DropDownList 中保存 ViewState

.net - 在发布方的 SimpleInjector for MassTransit 中建立队列

c# - DataGridView 最右边的列用户增加大小不起作用

linq-to-sql - Linq to sql - 删除一些相关记录

c# - 使用 C# 访问公共(public) Google 日历

c# - 如何延迟 'hot' 任务,以便它们可以按设定顺序处理

c# - HttpContext 用户声明为空

c# - Linq2SQL 信息消息

c# - Linq 按不排序排序