This is weird ... done updates loads of times before but cannot spot why this is different. although I am using .net 4.0 now - however i doubt its a bug in its L2S implementation. Its not like this is a wierd and wonderful application of it. Although i am fairly sure this code worked whilst i was using the RC.
I have also managed to reproduce this error by building a project from scratch using the information below.
the problem here is that the update statement generated by L2S has no fields in the set statement. I have tried checking the that the pk is set (only reason why i would think ervery field would be required in the where) and also read aroudn the other dbml properties. I have been using linq2Sql for about 1 year and have never had a problem .. i still think i am just having a huge brain fart.
Note: I have cleaned up the equals and GetHashCode methods to remove some fields - the problem persists after this. I have not cleaned up the SQL though.
I have a client class from the dbml I added a method called update
public partial class Client : ICopyToMe<Client>
The CopyToMe method is inherited from an interface
public interface ICopyToMe<T>
{
void CopyToMe(T theObject);
}
also the class has getHashCode overridden
public override int GetHashCode()
{
int retVal = 13 ^ ID ^ name.GetHashCode();
return retVal;
}
and equals
public override bool Equals(object obj)
{
bool retVal = false;
Client c = obj as Client;
if (c != null)
if (c.ID == this.ID && c._name == this._name)
retVal = true;
return retVal;
}
the update method in the partial class
public void UpdateSingle()
{
L2SDataContext dc = new L2SDataContext();
Client c = dc.Clients.Single<Client>(p => p.ID == this.ID);
c.CopyToMe(this);
c.updatedOn = DateTime.Now;
dc.SubmitChanges();
dc.Dispose();
}
The CopytoMe method
public void CopyToMe(Client theObject)
{
ID = theObject.ID;
name = theObject.name;
}
Im taking a client that was selected, changing its name and then calling this update method. The generated sql is as follows
exec sp_executesql N'UPDATE [dbo].[tblClient]
SET
WHERE ([ID] = @p0) AND ([name] = @p1) AND ([insertedOn] = @p2) AND ([insertedBy] = @p3) AND ([updatedOn] = @p4) AND ([updatedBy] = @p5)
AND ([deletedOn] IS NULL) AND ([deletedBy] IS NULL) AND (NOT ([deleted] = 1))',N'@p0 int,@p1 varchar(8000),@p2 datetime,@p3 int,@p4
datetime,@p5 int',@p0=103,@p1='UnitTestClient',@p2=''2010-05-17 11:33:22:520'',@p3=3,@p4=''2010-05-17 11:33:22:520'',@p5=3
I have no idea why this is not working ... used this kind of
select object -> set field to new value -> submit the selected object
pattern many times and not had this problem. there is also nothing obviously wrong with the dbml - although this is probably a false statement
any ideas?
This problem make sit look like i'm going to have to revert back to ADO.Net which would make me sad.