поля меняются в базе данных, прежде чем я позвоню
Если вы имеете в виду изменение как при изменении вне приложения, например, изменения в SQL Management Studio. Entity Framework не может обнаружить эти изменения, поэтому в результате вы можете получить устаревшие объекты, которые были кэшированы Entity Framework. Чтобы предотвратить получение кэшированного объекта и получение актуальных значений из базы данных, используйте AsNoTracking.
Попробуйте поставить AsNoTracking ():
var customer= db.customers.AsNoTracking().where(c=>c.id==1);
customer.name=santhosh;
customer.city=hyd;
db.SaveChanges();
Или, если ваша проблема заключается в обнаружении одновременных обновлений ( неудачная терминология , это не относится только к ОБНОВЛЕНИЮ) для той же строки, используйте тип поля rowversion (aka timestamp); затем в свой код .NET добавьте атрибут Timestamp
к свойству. Пример: http://www.ienablemuch.com/2011/07/entity-framework-concurrency-checking.html
public class Song
{
[Key]
public int SongId { get; set; }
public string SongName { get; set; }
public string AlbumName { get; set; }
[Timestamp]
public virtual byte[] Version { get; set; }
}
ОБНОВЛЕНИЕ (после вашего комментария) :
Если вы действительно не намерены сохранять изменения вашего объекта в базе данных. Попробуйте отсоединить объект.
Попробуйте это:
var customer= db.customers.where(c=>c.id==1);
db.Entry(customer).State = System.Data.EntityState.Detached; // add this
customer.name=santhosh;
customer.city=hyd;
db.SaveChanges();
Это не сохранит ваши изменения имени и города в базе данных.
Если вы хотите что-то более надежное (приведенное выше не даст исключение, если объект еще не был присоединен), создайте помощника:
private static void Evict(DbContext ctx, Type t,
string primaryKeyName, object id)
{
var cachedEnt =
ctx.ChangeTracker.Entries().Where(x =>
ObjectContext.GetObjectType(x.Entity.GetType()) == t)
.SingleOrDefault(x =>
{
Type entType = x.Entity.GetType();
object value = entType.InvokeMember(primaryKeyName,
System.Reflection.BindingFlags.GetProperty,
null, x.Entity, new object[] { });
return value.Equals(id);
});
if (cachedEnt != null)
ctx.Entry(cachedEnt.Entity).State = EntityState.Detached;
}
Для использования: Evict(yourDbContextHere, typeof(Product), "ProductId", 1);
http://www.ienablemuch.com/2011/08/entity-frameworks-nhibernate.html