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

Linq to SQL – 无法更新分享

时间:2023-04-10 18:15:04 C#

C#学习教程:LinqtoSQL-无法更新出于某种原因,我可以更新项目实体的每个字段,但名称除外。这是我写的两个简单测试:[TestMethod]publicvoidTestUpdateName(){using(varcontext=newSimoneDataContext()){if(item!=null){item.Name="我的新名字";context.SubmitChanges();}}}[TestMethod]publicvoidTestUpdateMPN(){using(varcontext=newSimoneDataContext()){Itemitem=context.Items.First();if(item!=null){item.MPN="我的新MPN";context.SubmitChanges();}}}不幸的是,TestUpdateName()失败并出现以下错误:System.Data.SqlClient.SqlException:关键字“WHERE”附近的语法不正确。这是SQL的输出:UPDATE[dbo]。[项目]SETWHERE([Id]=@p0)AND([CategoryId]=@p1)AND([MPN]=@p2)AND([Height]=@p3)AND([Width]=@p4)AND([Weight]=@p5)AND([Length]=@p6)AND([AdministrativeCost]=@p7)–@p0:InputInt(Size=0;Prec=0;Scale=0)[1]–@p1:InputInt(Size=0;Prec=0;Scale=0)[1]-@p2:InputVarChar(Size=10;Prec=0;Scale=0)[我的新函数]MPN]-@p3:输入十进制(大小=0;Prec=5;比例=3)[30.000]-@p4:输入十进制(大小=0;Prec=5;比例=3)[10.000]-@p5:输入十进制(大小=0;Prec=5;Scale=3)[40.000]–@p6:InputDecimal(Size=0;Prec=5;Scale=3)[30.000]–@p7:InputMoney(Size=0;Prec=19;Scale=4)[350.0000]-Context:SqlProvider(Sql2008)Model:AttributedMetaModelBuild:3.5.30729.4926如您所见,没有生成任何更新(SET为空...)我不知道为什么会这样。并且已经提前......是的,表格项目有PK(Id)。提前致谢!更新:错误似乎是由覆盖GetHashcode()引起的。这是我当前的实现:returnstring.Format("{0}|{1}|{2}|{3}",Name,Id,UPC,AdministrativeCost).GetHashCode();听起来您的DBML可能未同步。您应该删除表并重新添加它们,然后尝试再次运行它。只需手动删除Items表并重新添加即可。编辑:根据您的编辑,您应该检查以下关于GetHashCode的线程。http://social.msdn.microsoft.com/forums/en-US/linqtosql/thread/6cc6c226-f718-4b22-baad-dba709afe74b/.Net规则规定GetHashCode()和Equals()必须始终串联实施.两个相等的对象必须具有相同的哈希码。此外,GetHashCode()+Equals()的组合形成实体的身份概念。如果您根据字段值(PK除外)设置它,则当您更改字段时,id会发生变化。如果L2S必须根据实体的身份在字典中查找额外的信息,这是不好的,特别是如果L2S需要在其身份缓存中查找实体!建议:不要更改实体的身份。L2S希望它基于对象的自然(基于地址)身份。生成的SQL好像没有包含SET子句的内容(注意SET后面没有[Name]=@pXX)。实体字段的所有属性(数据类型、大小等)是否在dbml设计器中正确设置?以上是C#学习教程:LinqtoSQL–无法更新所有分享的内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处: