【问题标题】:Values returned from my Repository model class is being cached从我的存储库模型类返回的值正在被缓存
【发布时间】:2014-03-10 17:58:11
【问题描述】:

我有以下 Post Edit 操作方法:-

 [HttpPost]
 [ValidateAntiForgeryToken]
 [CheckUserPermissions(Action = "Edit", Model = "StorageDevice")]
        public ActionResult Edit(SDJoin sdj, FormCollection formValues)
        {
            //code goes here

                if (ModelState.IsValid)
                {

                    repository.Save();
            catch (DbUpdateConcurrencyException ex)
            {
var entry = ex.Entries.Single();
var databaseValues = (TMSStorageDevice)entry.GetDatabaseValues().ToObject();
var clientValues = (TMSStorageDevice)entry.Entity;

var databaseTechnology2 = repository.FindTechnology2(sdj.StorageDevice.TMSStorageDeviceID);

if (sdj.NetworkInfo.IPAddress != databaseTechnology2.TechnologyIPs.SingleOrDefault(a=>a.IsPrimary == true).IPAddress )

                    ModelState.AddModelError("NetworkInfo.IPAddress", "Value Has Changed "
                           );
                if (sdj.NetworkInfo.MACAddress != databaseTechnology2.TechnologyIPs.SingleOrDefault(a => a.IsPrimary == true).MACAddress)

                    ModelState.AddModelError("NetworkInfo.MACAddress", "Value Has Changed "
                           );
                if (databaseValues.RackID != clientValues.RackID)

                ModelState.AddModelError("StorageDevice.RackID", "Value Has Changed "
                       );

但是目前从

返回的值
var databaseTechnology2 = repository.FindTechnology2(sdj.StorageDevice.TMSStorageDeviceID);

将返回服务器内部的缓存值,而不是检索当前数据库值。存储库方法是:-

public Technology FindTechnology2(int id)
        {

            return tms.Technologies.Include(a=>a.TechnologyIPs).SingleOrDefault(a => a.TechnologyID == id);
        }

谁能给点建议?

【问题讨论】:

  • 这可能是您在同一上下文中查询的问题。您可以尝试使用 MergeOption.OverwriteChanges 解决它,如此处所述 (stackoverflow.com/questions/6126845/…)
  • 我尝试编写诸如“ObjectQuery query = entities.TechnologyRoles;”之类的东西但我收到以下错误:无法将类型“System.Data.Entity.DbSet”隐式转换为“System.Data.Objects.ObjectQuery”

标签: asp.net asp.net-mvc linq entity-framework asp.net-mvc-4


【解决方案1】:

为了正确显示代码,我将其发布为对我的评论的跟进。

您可以设置 MergeOptions.OverwriteChanges 如下:

var objectContext = ((IObjectContextAdapter)entities).ObjectContext; //assuming 'entities' is your context here
var set = objectContext.CreateObjectSet<TechnologyRoles>();
set.MergeOption = MergeOption.OverwriteChanges;
var query = set.SingleOrDefault(a => a.TechnologyID == id);

希望这会有所帮助,

【讨论】:

  • 您可以尝试使用 Refresh 方法吗? msdn.microsoft.com/en-us/library/bb896255.aspx
  • 不确定在我的代码中应用引用的位置?
  • 您可以查看提供的链接以及此链接。 stackoverflow.com/questions/2564265/…
  • 我使用它如下:- return tms.Technologies.AsNoTracking().Include(a=>a.TechnologyIPs).SingleOrDefault(a => a.TechnologyID == id); .而且效果很好,不确定这是否是解决我的问题的正确方法?有什么想法吗?
  • AsNoTracking() 表示 ObjectContext 实例不会在本地缓存实体。所以在这种情况下,你绕过了缓存,因此你得到了你想要的结果。但是,我想知道如果您更新实体,结果将持续存在。你可以参考这个答案(stackoverflow.com/questions/14527721/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
相关资源
最近更新 更多