Isa*_*c E 7 c# sql-server linq-to-sql
我在将linq更新为sql实体时遇到了一些麻烦.出于某种原因,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( );
}
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,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([Height] = @ p3)AND([Width] = @ 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;标度= 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:输入Money(Size = 0; Prec = 19; Scale = 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( );
Kel*_*sey 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期望它基于对象的自然(基于地址)身份.
| 归档时间: |
|
| 查看次数: |
2420 次 |
| 最近记录: |