Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有RIA+EntityFramework+MVVM的Silverlight 4:Childwindow DomainContext加载未刷新_C#_Silverlight_Entity Framework_Silverlight 4.0_Ria - Fatal编程技术网

C# 具有RIA+EntityFramework+MVVM的Silverlight 4:Childwindow DomainContext加载未刷新

C# 具有RIA+EntityFramework+MVVM的Silverlight 4:Childwindow DomainContext加载未刷新,c#,silverlight,entity-framework,silverlight-4.0,ria,C#,Silverlight,Entity Framework,Silverlight 4.0,Ria,我有一个silverlight 4应用程序,它使用RIA和EF在单个DomainContext中查询多个表。BUGroup、BUGroup Building和vwBusinessUnit。 UI基本上加载了BUGroup实体集,我可以选择不同的BUGroup,它会像这样加载子表: 我有一个DomainContext,我正在将它传递到“管理建筑物”按钮中的“儿童”窗口,如下所示: ManageBuildingsChildWindow ManageBuildingscw = ne

我有一个silverlight 4应用程序,它使用RIA和EF在单个DomainContext中查询多个表。BUGroup、BUGroup Building和vwBusinessUnit。

UI基本上加载了BUGroup实体集,我可以选择不同的BUGroup,它会像这样加载子表:

我有一个DomainContext,我正在将它传递到“管理建筑物”按钮中的“儿童”窗口,如下所示:

        ManageBuildingsChildWindow ManageBuildingscw = new ManageBuildingsChildWindow();
        ManageBuildingscw.Closed += new EventHandler(ManageBuildingscw_Closed);            
        ManageBuildingscw.DataContext = null; 
        ManageBuildingsViewModel ManageBuildingsViewModel = new ManageBuildingsViewModel();                    
        ManageBuildingscw.DataContext = ManageBuildingsViewModel;
        GetBUGroupResult = SecurityDomainContext.Current.Load(SecurityDomainContext.Current.GetBUGroupsCustomQuery(), LoadBehavior.RefreshCurrent, false);
        GetBUGroupResult.Completed += new EventHandler(GetBUGroupResult_Completed);
然后我在childwindow视图模型中加载childwindow上下文,如下所示:

        ManageBuildingsChildWindow ManageBuildingscw = new ManageBuildingsChildWindow();
        ManageBuildingscw.Closed += new EventHandler(ManageBuildingscw_Closed);            
        ManageBuildingscw.DataContext = null; 
        ManageBuildingsViewModel ManageBuildingsViewModel = new ManageBuildingsViewModel();                    
        ManageBuildingscw.DataContext = ManageBuildingsViewModel;
        GetBUGroupResult = SecurityDomainContext.Current.Load(SecurityDomainContext.Current.GetBUGroupsCustomQuery(), LoadBehavior.RefreshCurrent, false);
        GetBUGroupResult.Completed += new EventHandler(GetBUGroupResult_Completed);
下面是GetBUGroupResult的事件处理程序

        void GetBUGroupResult_Completed(object sender, EventArgs e)
        {                
            GetBUGroupBuildings = SecurityDomainContext.Current.BUGroupBuildings.Where(w => w.BUGroupID == BUGroupID).ToList();
            GetBUGroupResult.Completed -= new EventHandler(GetBUGroupResult_Completed);               
        }
我将每个BUGroupBuilding绑定到datagrid中的一个删除链接,它将从数据库中删除。当我单击manage building按钮调用子窗口时,它第一次加载良好。如果我有5栋楼,它会承载5栋楼。问题是当我在删除一些建筑后第二次或其他时间加载它时。即使在加载之后,它仍保留旧的DomainContext。 我甚至尝试将LoadBehavior设置为GetBugGroupsCustomQuery的RefreshCurrent

假设我在一个组中有5栋建筑,我使用删除链接在父窗口中删除了2栋,所以现在我有3栋。调用子窗口。它仍然显示5。

现在,我中断了GetBugGroupsCustomQuery的DomainServices,并返回了正确的3值

但是在GetBUGroupResult_完成的事件处理程序中,我仍然看到5栋建筑。看起来我的DomainContext没有刷新,即使我指定loadbehavior刷新当前。 有什么意见吗


我遇到了与此类似的问题,解决方法是将数据加载到上下文中,然后分离实体集合中不在新返回对象集合中的任何对象。在加载操作中尝试以下操作:

SecurityDomainContext.Current.Load<YourObjectType>(
    SecurityDomainContext.Current.GetBUGroupsCustomQuery(),
    LoadBehavior.MergeIntoCurrent,
    loadOperation =>
    {
        var results = context.Comments.Where(
            entity => !loadOperation.Entities.Contains(entity)).ToList();
        results.ForEach(entity => context.Comments.Detach(entity));
    }, null);
我不确定您是否需要替换为返回的实体类型,或者您是否可以删除该部分,但这至少可以让您接近。您还可以执行以下操作:

var c = SecurityDomainContext.Current;
var group = c.BUGroups.Single(w => w.BUGroupID == BUGroupID);    
c.Refresh(RefreshMode.StoreWins, group.BUGroupBuildings);
GetBUGroupBuildings = group.BUGroupBuildings.ToList(); 

通过RefreshMode.StoreWins,可以保证检索到数据库的当前状态。

我需要替换entityObject。问题是,似乎有两种不同的背景。我可以创建一个新的DomainContext,然后加载它。但问题是,当我们从子对象中删除后返回到父对象时,父对象的上下文不会刷新。谢谢。你可以将上下文从一页传递到另一页。我不使用mvc,但我有一个项目,其中子窗口元素双向绑定到父窗口上下文中的对象,当子窗口上的实体对象发生更改时,它会在父窗口上实时更改。这可能是一个糟糕的解决方法,但在某些情况下,我不得不在父页面上创建一个事件,该事件链接到子窗口关闭事件。在ChildWindowClosed事件中,我将用上面的代码刷新上下文,我删除的项目将从对象集合中分离。