C# 在Silverlight 4 RIA(实体框架)中从数据库中删除对象

C# 在Silverlight 4 RIA(实体框架)中从数据库中删除对象,c#,silverlight,entity-framework,ria,C#,Silverlight,Entity Framework,Ria,我正在开发基于一对多关联的简单Silverlight4应用程序。 提出了关系模型 该页面由两个网格组成,一个直接从DomainDataSource(ExcelTemplate one)加载。选择ExcelTemplate后,第二个将加载ObservaleCollection中的ColumnValidationRules,该集合基于ExcelTemplate的列表填充。实体没有OnDelete操作。我在删除ColumnValidationRule对象族时遇到很多问题。基本上,我尝试了两种不同的方法

我正在开发基于一对多关联的简单Silverlight4应用程序。 提出了关系模型

该页面由两个网格组成,一个直接从DomainDataSource(ExcelTemplate one)加载。选择ExcelTemplate后,第二个将加载ObservaleCollection中的ColumnValidationRules,该集合基于ExcelTemplate的列表填充。实体没有OnDelete操作。我在删除ColumnValidationRule对象族时遇到很多问题。基本上,我尝试了两种不同的方法:

  • 使用仅删除ColumnValidationRule ColumnValidationRuleDomainDataSource(基于GetColumnValidationRule查询):
XAML与my DomainDataSources:

                                <riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my:ExcelTemplate, CreateList=true}" Height="0" LoadedData="ExcelTemplateDomainDataSource_LoadedData" Name="excelTemplatesForValidatiorsDDS" QueryName="GetExcelTemplatesQuery" Width="0">
                                    <riaControls:DomainDataSource.DomainContext>
                                        <my1:SRFDomainContext />
                                    </riaControls:DomainDataSource.DomainContext>
                                </riaControls:DomainDataSource>

                                <riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my:ColumnValidationRule, CreateList=true}" Height="0" LoadedData="ExcelTemplateDomainDataSource_LoadedData" Name="columnValidationRulesDomainDataSource" QueryName="GetColumnValidationRulesQuery" Width="0">
                                    <riaControls:DomainDataSource.DomainContext>
                                        <my1:SRFDomainContext />
                                    </riaControls:DomainDataSource.DomainContext>
                                </riaControls:DomainDataSource>
w System.ServiceModel.DomainServices.Client.EntitySet.Remove(Entity entity)
   w System.Windows.Controls.PagedEntityCollectionView.RemoveCore(Entity item, Int32 index)
   w System.Windows.Controls.PagedEntityCollectionView.RemoveItem(Entity item)
   w System.Windows.Controls.EntityCollectionView.Remove(Object item)
   w System.Windows.Controls.DomainDataSourceView.Remove(Object item)
   w LANOS.UserManagement.DeleteRuleButton_Click(Object sender, RoutedEventArgs e)
   w System.Windows.Controls.Primitives.ButtonBase.OnClick()
   w System.Windows.Controls.Button.OnClick()
   w System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
   w System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)
   w MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventN
结果我得到一个错误: 指定的实体不包含在此EntitySet中。

错误详细信息:

                                <riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my:ExcelTemplate, CreateList=true}" Height="0" LoadedData="ExcelTemplateDomainDataSource_LoadedData" Name="excelTemplatesForValidatiorsDDS" QueryName="GetExcelTemplatesQuery" Width="0">
                                    <riaControls:DomainDataSource.DomainContext>
                                        <my1:SRFDomainContext />
                                    </riaControls:DomainDataSource.DomainContext>
                                </riaControls:DomainDataSource>

                                <riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my:ColumnValidationRule, CreateList=true}" Height="0" LoadedData="ExcelTemplateDomainDataSource_LoadedData" Name="columnValidationRulesDomainDataSource" QueryName="GetColumnValidationRulesQuery" Width="0">
                                    <riaControls:DomainDataSource.DomainContext>
                                        <my1:SRFDomainContext />
                                    </riaControls:DomainDataSource.DomainContext>
                                </riaControls:DomainDataSource>
w System.ServiceModel.DomainServices.Client.EntitySet.Remove(Entity entity)
   w System.Windows.Controls.PagedEntityCollectionView.RemoveCore(Entity item, Int32 index)
   w System.Windows.Controls.PagedEntityCollectionView.RemoveItem(Entity item)
   w System.Windows.Controls.EntityCollectionView.Remove(Object item)
   w System.Windows.Controls.DomainDataSourceView.Remove(Object item)
   w LANOS.UserManagement.DeleteRuleButton_Click(Object sender, RoutedEventArgs e)
   w System.Windows.Controls.Primitives.ButtonBase.OnClick()
   w System.Windows.Controls.Button.OnClick()
   w System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
   w System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)
   w MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventN

  • 为每个对象族创建不同的DomainDataSource: ColumnValidationRule,AssociatedColumn,ColumnValue。然后使用这些DomainDataSource删除它们并从 从头到尾。这种方法也失败了。我也有类似的错误 第一种方法中的方法。有时也会有一些 DomainDataSource的为空
我在谷歌上搜索一些可以解决这个问题的例子,但我没有找到任何。感谢任何提示、链接或帮助;)


更新1:

                                <riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my:ExcelTemplate, CreateList=true}" Height="0" LoadedData="ExcelTemplateDomainDataSource_LoadedData" Name="excelTemplatesForValidatiorsDDS" QueryName="GetExcelTemplatesQuery" Width="0">
                                    <riaControls:DomainDataSource.DomainContext>
                                        <my1:SRFDomainContext />
                                    </riaControls:DomainDataSource.DomainContext>
                                </riaControls:DomainDataSource>

                                <riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my:ColumnValidationRule, CreateList=true}" Height="0" LoadedData="ExcelTemplateDomainDataSource_LoadedData" Name="columnValidationRulesDomainDataSource" QueryName="GetColumnValidationRulesQuery" Width="0">
                                    <riaControls:DomainDataSource.DomainContext>
                                        <my1:SRFDomainContext />
                                    </riaControls:DomainDataSource.DomainContext>
                                </riaControls:DomainDataSource>
w System.ServiceModel.DomainServices.Client.EntitySet.Remove(Entity entity)
   w System.Windows.Controls.PagedEntityCollectionView.RemoveCore(Entity item, Int32 index)
   w System.Windows.Controls.PagedEntityCollectionView.RemoveItem(Entity item)
   w System.Windows.Controls.EntityCollectionView.Remove(Object item)
   w System.Windows.Controls.DomainDataSourceView.Remove(Object item)
   w LANOS.UserManagement.DeleteRuleButton_Click(Object sender, RoutedEventArgs e)
   w System.Windows.Controls.Primitives.ButtonBase.OnClick()
   w System.Windows.Controls.Button.OnClick()
   w System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
   w System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)
   w MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventN
我采纳了你的建议:

    this.columnValidationRulesDomainDataSource.Load();
    ColumnValidationRule deletedObject = null;

    foreach (ColumnValidationRule cvr in this.columnValidationRulesDomainDataSource.DataView)
    {
        if (cvr.ID.Equals((this.srfValidatorsDataGrid.SelectedItem as ColumnValidationRule).ID))
        {
            deletedObject = cvr;
        }
    }
    this.columnValidationRulesDomainDataSource.DataView.Remove(deletedObject);
    this.columnValidationRulesDomainDataSource.SubmitChanges();
现在我收到了这个错误:提供的项不是Entity类型的实例:/


更新2:

                                <riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my:ExcelTemplate, CreateList=true}" Height="0" LoadedData="ExcelTemplateDomainDataSource_LoadedData" Name="excelTemplatesForValidatiorsDDS" QueryName="GetExcelTemplatesQuery" Width="0">
                                    <riaControls:DomainDataSource.DomainContext>
                                        <my1:SRFDomainContext />
                                    </riaControls:DomainDataSource.DomainContext>
                                </riaControls:DomainDataSource>

                                <riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my:ColumnValidationRule, CreateList=true}" Height="0" LoadedData="ExcelTemplateDomainDataSource_LoadedData" Name="columnValidationRulesDomainDataSource" QueryName="GetColumnValidationRulesQuery" Width="0">
                                    <riaControls:DomainDataSource.DomainContext>
                                        <my1:SRFDomainContext />
                                    </riaControls:DomainDataSource.DomainContext>
                                </riaControls:DomainDataSource>
w System.ServiceModel.DomainServices.Client.EntitySet.Remove(Entity entity)
   w System.Windows.Controls.PagedEntityCollectionView.RemoveCore(Entity item, Int32 index)
   w System.Windows.Controls.PagedEntityCollectionView.RemoveItem(Entity item)
   w System.Windows.Controls.EntityCollectionView.Remove(Object item)
   w System.Windows.Controls.DomainDataSourceView.Remove(Object item)
   w LANOS.UserManagement.DeleteRuleButton_Click(Object sender, RoutedEventArgs e)
   w System.Windows.Controls.Primitives.ButtonBase.OnClick()
   w System.Windows.Controls.Button.OnClick()
   w System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
   w System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)
   w MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventN
我添加了SubmitedChanges事件处理程序,正如我在文章开头所怀疑的,外键导致的删除存在问题:

e.Error.Message "Submit operation failed. An error occurred while updating the entries. See the inner exception for details. InnerException message: The DELETE statement conflicted with the REFERENCE constraint \"FK_AssociatedColumn_ColumnValidationRule\". The conflict occurred in database \"LANOS\", table \"dbo.AssociatedColumns\", column 'ColumnValidationRuleID'.\r\nThe statement has been terminated."
不幸的是,我无法设置模型以使用End-On-Delete-Cascade属性。 设置级联删除原因编译错误:

End 'ColumnValue' on relationship 'LANOSModel.FK_AssociatedColumnColumnValue' cannot have operation specified since its multiplicity is '*'. Operations cannot be specified on ends with multiplicity '*'.
“此EntitySet中不包含指定实体”的原因是。。。。等等。。。该实体的指定实例实际上不包含在EntitySet中

显然,您已从以前的数据上下文加载了数据网格,而
this.columnValidationRulesDomainDataSource.Load()
正在创建一组新的实体,因此无法从新数据集中删除特定的旧对象。它们具有相同的值,但不是相同的对象

但是,您可以使用对象中的键,并在新上下文(id匹配的上下文)上执行删除操作。只需先找到匹配的实例并删除它


如果你能提供更多的细节/代码,我也许能提供一个具体的例子,但你现在应该有足够的时间继续下去。

你是如何填写数据视图的?根据错误消息,您试图删除一个未附加到上下文的实体,因此您可能在某个地方创建了该实体的副本?请将这段代码发布在充装数据视图的充电器中。我已经添加了您要求的代码。虽然很痛苦,但我已设法解决了所有问题。你的提示非常有用,所以谢谢你的帮助。干杯