Linq to SQL - 无法更新

时间:2010-06-10 17:46:58

标签: c# sql-server linq-to-sql

我在将linq更新为sql实体方面遇到了一些麻烦。 出于某种原因,除了 name 之外,我还可以更新item实体的每个字段。

以下是我写的两个简单测试:

 [TestMethod]
        public void TestUpdateName( ) {
            using ( var context = new SimoneDataContext( ) ) {
                Item item = context.Items.First( );

                if ( item != null ) {
                    item.Name = "My New Name";
                    context.SubmitChanges( );
                }
            }
        }

        [TestMethod]
        public void TestUpdateMPN( ) {
            using ( var context = new SimoneDataContext( ) ) {
                Item item = context.Items.First( );

                if ( item != null ) {
                    item.MPN = "My New MPN";
                    context.SubmitChanges( );
                }
            }
        }

不幸的是,TestUpdateName()失败并出现以下错误: System.Data.SqlClient.SqlException: Incorrect syntax near the keyword 'WHERE'..

这是输出的SQL:

  

UPDATE [dbo]。[Items] SET WHERE([Id]   = @ p0)AND([CategoryId] = @ p1)AND([MPN] = @ p2)AND([高度] = @ p3)AND   ([宽度] = @ p4)AND([重量] = @ p5)   AND([长度] = @ p6)AND   ([AdministrativeCost] = @ p7)    - @ p0:输入Int(大小= 0; Prec = 0; Scale = 0)[1]    - @ p1:输入Int(大小= 0; Prec = 0; Scale = 0)[1]    - @ p2:输入VarChar(大小= 10; Prec = 0; Scale = 0)[我的新MPN]    - @ p3:输入十进制(大小= 0; Prec = 5; Scale = 3)[30.000]    - @ p4:输入十进制(大小= 0; Prec = 5;比例= 3)[10.000]    - @ p5:输入十进制(大小= 0; Prec = 5; Scale = 3)[40.000]    - @ p6:输入十进制(大小= 0; Prec = 5; Scale = 3)[30.000]    - @ p7:输入金钱(大小= 0; Prec = 19;比例= 4)[350.0000]    - 上下文:SqlProvider(Sql2008)模型:AttributedMetaModel Build:   3.5.30729.4926

如您所见,没有生成更新(SET为空......) 我不知道为什么会这样。

并且已提前......是,表Item有一个PK(Id)。 提前谢谢

更新的 看来错误是由重写GetHashcode()引起的。 这是我目前的实施:

return string.Format( "{0}|{1}|{2}|{3}", Name, Id, UPC, AdministrativeCost).GetHashCode( );

2 个答案:

答案 0 :(得分:12)

听起来你的DBML可能不同步。您应该删除表并重新添加它们并尝试再次运行它。

只需手动删除Items表并重新添加。

编辑:根据您的修改,您应该查看以下关于GetHashCode的帖子。

http://social.msdn.microsoft.com/forums/en-US/linqtosql/thread/6cc6c226-f718-4b22-baad-dba709afe74b/

  

.Net规则声称GetHashCode()   和Equals()必须始终如一   串联实施。两个对象   相等的必须具有相同的哈希值   码。

     

此外,GetHashCode()的组合   + Equals()构成了实体的身份概念。如果你是基于   字段值(除了PK)然后是   更改时身份会发生变化   领域。如果L2S必须查找,这是不好的   基于的字典中的其他信息   实体的身份,尤其是   如果L2S需要在其中找到一个实体   身份缓存!

     

建议:不要改变身份   一个实体。 L2S希望它是基于的   对象的自然(地址   基于)身份。

答案 1 :(得分:0)

生成的SQL似乎不包括SET子句的内容(请注意[Name] = @pXX之后没有SET)。是否在dbml designer中正确设置了实体字段的所有属性(数据类型,大小等)?