All credit goes to Nicolas Repiquet for the answer.
The entities in SubSonic have a custom implementation of Equals()
which is the cause of this problem. Deleting the custom implementation solves the issue, though I will still use my original solution of the wrapped SubSonic entities since I don't want to mess with the framework.
public override bool Equals(object obj){
if(obj.GetType()==typeof(NaughtyItem)){
NaughtyItem compare=(NaughtyItem)obj;
return compare.KeyValue()==this.KeyValue();
}else{
return base.Equals(obj);
}
}