Проблема в том, что этот запрос
string thisQueryWillMessThingsUp =
context.SaleMethods.Where(m => m.Id == 2).Single().Name;
переносит один экземпляр сущности SaleMethod в контекст, а затем этот код
context.Entry(method).State = System.Data.EntityState.Modified;
присоединяет другой экземпляр к контексту.Оба экземпляра имеют один и тот же первичный ключ, поэтому EF считает, что вы пытаетесь присоединить два разных объекта с одним и тем же ключом к контексту.Он не знает, что они оба должны быть одной и той же сущностью.
Если по какой-то причине вам просто нужно запросить имя, но вы не хотите на самом деле привести полную сущность в контекст,тогда вы можете сделать это:
string thisQueryWillMessThingsUp =
context.SaleMethods.Where(m => m.Id == 2).AsNoTracking().Single().Name;
Если вы пытаетесь обновить существующую сущность, и у вас есть значения для всех сопоставленных свойств этой сущности, то самое простое, что нужно сделать, это не запускатьзапросите и просто используйте:
context.Entry(method).State = System.Data.EntityState.Modified;
Если вы не хотите обновлять все свойства, возможно, из-за того, что у вас нет значений для всех свойств, тогда запросите сущность и задайте для нее свойства перед вызовом SaveChangesэто приемлемый подход.Есть несколько способов сделать это в зависимости от ваших конкретных требований.Одним из способов является использование метода Property, что-то вроде этого:
var salesMethod = context.SaleMethods.Find(2); // Basically equivalent to your query
context.Entry(salesMethod).Property(e => e.Name).CurrentValue = newName;
context.Entry(salesMethod).Property(e => e.SomeOtherProp).CurrentValue = newOtherValue;
context.SaveChanges();
Эти сообщения блога содержат некоторую дополнительную информацию, которая может оказаться полезной:
http://blogs.msdn.com/b/adonet/archive/2011/01/29/using-dbcontext-in-ef-feature-ctp5-part-4-add-attach-and-entity-states.aspx
http://blogs.msdn.com/b/adonet/archive/2011/01/30/using-dbcontext-in-ef-feature-ctp5-part-5-working-with-property-values.aspx