Попробуйте db.AttachTo () вместо db.Attach ()
Как описано здесь
"Вызовите AttachTo для ObjectContext, чтобы прикрепить объект к определенному объекту, заданному в контексте объекта. Также сделайте это, если объект имеет нулевое значение (Nothing в Visual Basic) EntityKey."
Редактировать: на самом деле, вам может потребоваться вызвать ApplyPropertyChanges () в этом случае.
Редактировать 2: Вы можете создать ключ сущности для своего объекта с помощью кода, подобного следующему:
public EntityKey GetEntityKey(string entitySetName, object keyValue)
{
IEnumerable<KeyValuePair<string, object>> entityKeyValues =
new[]
{
new KeyValuePair<string, object>("Id", keyValue)
};
var key = new EntityKey(string.Concat("YOUR_OBJECT_CONTEXT_NAME.", entitySetName), entityKeyValues);
return key;
}
И затем вы бы назвали это как-то так для ключей сущностей, основанных на одном столбце базы данных под названием «Id»:
var entityKey = GetEntityKey ("Клиент", 23);
Я использую аналогичный метод в своем собственном коде EF, за исключением аргумента типа Generic, чтобы избежать необходимости использовать строку для имени класса сущности.