我在刷新数据库中的对象时遇到问题。我有两台PC和两台应用程序。
在第一台PC上,有一个与我的数据库通信的应用程序,并将一些数据添加到Measurements表中。 在我的另一台PC上,有一个应用程序可以在一个计时器下检索最新的测量,所以它应该在我的第一台PC上检索应用程序添加的测量结果。
问题在于它没有。在我的应用程序启动时,它会缓存数据库中的所有数据,并且永远不会添加新数据。我使用Refresh()方法,当我更改任何缓存数据时它很有效,但它不刷新新添加的数据。
以下是我应该更新数据的方法:
public static Entities myEntities = new Entities();
public static Measurement GetLastMeasurement(int conditionId)
{
myEntities.Refresh(RefreshMode.StoreWins, myEntities.Measurements);
return (from measurement in myEntities.Measurements
where measurement.ConditionId == conditionId
select measurement).OrderByDescending(cd => cd.Timestamp).First();
}
P.S。 应用程序在app.config中具有不同的连接字符串(同一数据库的不同帐户)。
答案 0 :(得分:9)
这应该有效:
public static Entities myEntities = new Entities();
public static Measurement GetLastMeasurement(int conditionId)
{
myEntities.Refresh(RefreshMode.StoreWins, myEntities.Measurements);
var allMeasurements = myEntities.Measurements.ToList();//retrieves all measurements from database
return (from measurement in allMeasurements
where measurement.ConditionId == conditionId
select measurement).OrderByDescending(cd => cd.Timestamp).First();
}
每次想要使用它时刷新存储时有什么意义?你可以把它变成:
public Measurement GetLastMeasurement(int conditionId)
{
var entities = new Entities();
return (from measurement in entities.Measurements
where measurement.ConditionId == conditionId
select measurement).OrderByDescending(cd => cd.Timestamp).First();
}
每次调用时,它也会在数据库中查找,但操作次数会少得多。
答案 1 :(得分:8)
从EF 4.1起,您可以在实体上使用AsNoTracking()方法。
return myEntities.Measurements.AsNoTracking();
请注意,AsNoTracking()不会将实体添加到您的上下文进行跟踪,而只是从数据存储中重新返回它们。
答案 2 :(得分:3)
另一种可能性是使用MergeOption来决定如何管理上下文中的对象。例如,MergeOption.OverwriteChanges
将使用数据源中的值覆盖对象上下文。
有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.data.objects.mergeoption.aspx