当前位置: 首页 > 编程语言 > C#

优化版本库的SubmitChanges方法分享

时间:2023-04-11 02:01:55 C#

优化版本库的SubmitChanges方法我有如下版本库。我使用工厂在LINQ2SQL生成的类和域对象之间进行映射。以下代码将起作用;但我看到两个潜在的问题1)它在更新语句之前使用SELECT查询。2)它需要更新所有列(不仅是更改的列)。这是因为我们不知道域对象中所有列的变化。如何克服这些缺点?注意:可能存在基于特定列更新执行的场景(例如触发器)。所以我不能不必要地更新列。参考:LINQtoSQL:“UpdateCheck=Never”时不刷新更新http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=113917}公共类LijosSimpleBankRepository:ILijosBankRepository{privateIBankAccountFactorybankFactory=newMySimpleBankAccountFactory();公共System.Data.Linq.DataContext上下文{得到;放;}publicvirtualvoidSubmitChangesForEntity(DomainEntitiesForBank.IBankAccountiBankAcc){//没有从自动更改跟踪中获得帮助(由于映射)//选择所需的实体DBML_Project.BankAccounttableEntity=Context.GetTable().SingleOrDefault(p=>p.BankAccountID==iBankAcc.BankAccountID);if(tableEntity!=null){//将所有值设置为更新(主键除外)tableEntity.Status=iBankAcc.AccountStatus;//类型检查if(iBankAccisDomainEntitiesForBank.FixedBankAccount){tableEntity.AccountType="Fixed";}if(iBankAcc是DomainEntitiesForBank.SavingsBankAccount){tableEntity.AccountType="Savings";}Context.SubmitChanges();}}}}namespaceDomainEntitiesForBank{publicinterfaceIBankAccount{intBankAccountID{get;set;get;set;}stringAccountStatus{get;set;}voidFreezeAccount();}publicclassFixedBankAccount:IBankAccount{publicintBankAccountID{get;set;}publicstringAccountStatus{get;set;}publicdoubleBalance{get;set;}publicvoidFreezeAccount(){AccountStatus="Frozen";}}}如果我正确理解你的问题,你将被传递到需要保存到数据库的实体,而不知道原始值是什么,或者哪些列实际更改了如果这是在这种情况下,那么您有四个选项您需要返回数据库以查看原始值,即进行选择,就像您写的那样。这允许您设置所有实体值,Linq2Sql将处理哪些列是actuallychanged.所以如果没有任何列实际发生变化,则不会触发更新语句。您需要避免选择并只更新列。您已经知道该怎么做(但对于看到此问答的其他人而言)。由于您不知道哪些列已更改,因此您无法选择所有列。这将生成一个更新语句,即使实际上没有更改任何列,它可以触发任何数据库触发器。除了禁用触发器之外,您在这里唯一可以做的是确保编写触发器来检查旧列值和新列值,以避免任何进一步不必要的更新。你需要改变你的需求/程序,这样你就需要旧的和新的实体值,这样你就可以在不返回数据库的情况下确定哪些列发生了变化。不要使用LINQ进行更新。LINQ代表LanguageIntegratedQUERY,它在查询时(恕我直言)非常出色,但我总是将更新/删除功能视为额外的好处,而不是它的设计目的。此外,如果时间/性能至关重要,LINQ无法正确匹配手工制作的SQL。这不是DDD问题;从我可以告诉你的问题:Usinglinqtogeneratedirectupdateswithoutselect.关于禁用触发器的第二点已在此处和此处得到解答。但是,正如其他人评论的那样,您真的需要触发器吗?您应该在代码中控制这些更新吗?总的来说,我认为你正在寻找过早的优化。您正在使用ORM,作为其中的一部分,您相信L2S会为您做出数据库管道决策。但请记住,在适当的时候,您可以使用存储过程来执行特定的SQL。以上就是C#学习教程:优化版本库的SubmitChanges方法分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处: