【问题标题】:I do not understand how EF5 dbContext.Entry(entity).Reload() method is supposed to work?我不明白 EF5 dbContext.Entry(entity).Reload() 方法应该如何工作?
【发布时间】:2013-06-01 11:43:19
【问题描述】:

在这个例子中:

using System;
using System.Collections.Generic;
using dbModel;
using System.Linq;
using System.Data.Entity.Infrastructure;


namespace WinApp
{
    public partial class Form1 : Form
    {
        private dbEntities dbc;
        public IQueryable<ARTIKLI> art;
        public IQueryable<ART_GRUPE> grp;

        public Form1()
        {
            InitializeComponent();
            dbc = new dbEntities();            
        }


        private void GetData()
        {
            art = from a in dbc.ARTIKLIs
                        select a;

            grp = from g in dbc.ART_GRUPE
                        select g;

            artikliBindingSource.DataSource = art.ToList();
            artGrupeBindingSource.DataSource = grp.ToList();
        }


        private void Form1_FormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e)
        {
            dbc.SaveChanges();
        }


        private void loadData_Click(object sender, EventArgs e)
        {
            this.GetData();  
        }


        private void refresh_Click(object sender, EventArgs e)
        {

            dbc.Entry(grp).Reload();
            artGrupeBindingSource.ResetBindings(false);
        }

    }
}

一切正常。但是当我运行并单击刷新按钮时出现错误:

实体类型 DbQuery`1 不是当前上下文模型的一部分

我只是尝试使用DbContextgrp 实体实例从存储中刷新数据。我知道我可以将DbContext 转换为ObjectContext 然后使用Refresh 方法,但是 DbContext.Entry(entity).Reload();应该可以做同样的事情

有人可以解释我在上面代码中的错误吗?

【问题讨论】:

  • grp 不是实体,而是查询
  • 我知道...如何使用 dbContext 刷新查询?
  • 我会再次致电GetData
  • @Virtuo。请告诉我们dbEntities 是什么(是DbContext),当您说“再次调用GetData 不起作用”时,您所说的“不起作用”是什么意思":如果您想很好地回答您的问题,错误消息或(缺乏)预期行为很重要。
  • DbContext 中现在有“StoreWins”刷新机制,就像在 ObjectContext 中一样。使用重新加载,您一次只能刷新一个实体。这里的最佳实践是处理 DbContext,创建新的并再次获取数据。我也错过了 ObjectContext 刷新:(

标签: c# winforms orm entity-framework-5


【解决方案1】:

如果dbEntitiesDbContext,那么您实际上是在说dbc.Entry&lt;ART_GRUPE&gt;().Reload(); 放弃所有更改并重新加载实体,而不是重新加载您的查询。然而,这并不存在。您可以使用dbc.Entry&lt;ART_GRUPE&gt;(myEntity).Reload() ("MSDN - DbEntityEntry<TEntity>.Reload Method") 放弃对单个实体所做的任何更改。

DbContext 并不意味着长寿,您应该将它用于您的查询,然后摆脱它。如果您想将其转换为对象上下文,您可以尝试:

var ctx = ((IObjectContextAdapter)db).ObjectContext;
ctx.Refresh();

这可能不是您需要的。它也不会从您的上下文中删除从数据库中删除的实体,并且它并不总是刷新关系。您最好摆脱上下文并再次加载它:

private void GetData()
{
    // you could wrap this in a using statement, though that isn't necessary
    using (var dbc = new dbEntities())
    {
        art = from a in dbc.ARTIKLIs
            select a;

        grp = from g in dbc.ART_GRUPE
            select g;

        artikliBindingSource.DataSource = art.ToList();
        artGrupeBindingSource.DataSource = grp.ToList();
    }
}
private void refresh_Click(object sender, EventArgs e)
{
    GetData();
    // not sure you need this next line now, but you should test
    artGrupeBindingSource.ResetBindings(false); 
}

这可能导致您的问题是您正在对ARTIKLIs 进行更改并尝试跟踪它们。为此,您可以使用以下内容来保存更改,并且不要每次都重新加载您的 ARTIKLIs

private void GetData(bool loadArtikli = true)
{
    // you could wrap this in a using statement, though that isn't necessary
    using (var dbc = new dbEntities())
    {
        if (loadArtikli)
        {
            art = from a in dbc.ARTIKLIs
                select a;
        }

        grp = from g in dbc.ART_GRUPE
            select g;

        artikliBindingSource.DataSource = art.ToList();
        artGrupeBindingSource.DataSource = grp.ToList();
    }
}
private void refresh_Click(object sender, EventArgs e)
{
    GetData(false);
}

public static void UpdateARTIKLI(ARTIKLI item)
{
  using (var dbc = new dbEntities())
  {
    if (item.Id > 0)
    { // update existing ones
      var dbitem = context.ARTIKLI 
        .Find(item.Id);

      context.Entry(dbItem)
        .CurrentValues
        .SetValues(item);
    }
    else
    { // deal with new ones
      context.ARTIKLI.Add(item);
    }

    context.SaveChanges();
  }
}

【讨论】:

  • 应该是什么实例?
  • @WiktorZychla。已更正,谢谢。 instance 是我缺乏咖啡和睡眠的虚构。
  • 也许还是错了。入口方法需要实例参数。
  • @WiktorZychla。咖啡收购。答案重写!
  • @Virtuo。也看看这个:Entity Framework 4.1 DbSet Reload。在我的回答中还添加了一条关于转换为 ObjectContext 的评论
猜你喜欢
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 2015-09-08
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多