在我调用之前,数据库中的字段正在更改
如果您的意思是在应用程序外部进行更改,例如在 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();
或者,如果您的问题是检测同一行的并发更新(unfortunate terminology,它不适用于 UPDATE),请使用 rowversion(又名时间戳)字段类型;然后在您的 .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