You set IsNew to false, but you don't mark any fields as changed, so the entity's IsDirty flag is false (it's a flag on the fields: certificate.Fields.IsDirty)
I don't know how you do change tracking, but research we did among web devs resulted in that most people using MVC refetch the entity, then set the properties of the fetched entity with the values from the entity to persist and then save the fetched entity again (so any changes are tracked properly).
You can also do:
bool isDirty = false;
foreach(var field in certificate.Fields)
{
if(field.IsPrimaryKey || field.IsReadOnly)
{
continue;
}
field.IsChanged = true;
isDirty = true;
}
certificate.Fields.IsDirty = isDirty;
and then save it (you can make this a generic method of course)
Not tested but you get the idea. This might mark fields which aren't to be updated as updated, and it will always update your entity, even if nothing changed.