C# 在Silverlight 4 RIA(实体框架)中从数据库中删除对象
我正在开发基于一对多关联的简单Silverlight4应用程序。 提出了关系模型 该页面由两个网格组成,一个直接从DomainDataSource(ExcelTemplate one)加载。选择ExcelTemplate后,第二个将加载ObservaleCollection中的ColumnValidationRules,该集合基于ExcelTemplate的列表填充。实体没有OnDelete操作。我在删除ColumnValidationRule对象族时遇到很多问题。基本上,我尝试了两种不同的方法:C# 在Silverlight 4 RIA(实体框架)中从数据库中删除对象,c#,silverlight,entity-framework,ria,C#,Silverlight,Entity Framework,Ria,我正在开发基于一对多关联的简单Silverlight4应用程序。 提出了关系模型 该页面由两个网格组成,一个直接从DomainDataSource(ExcelTemplate one)加载。选择ExcelTemplate后,第二个将加载ObservaleCollection中的ColumnValidationRules,该集合基于ExcelTemplate的列表填充。实体没有OnDelete操作。我在删除ColumnValidationRule对象族时遇到很多问题。基本上,我尝试了两种不同的方法
- 使用仅删除ColumnValidationRule ColumnValidationRuleDomainDataSource(基于GetColumnValidationRule查询):
<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匹配的上下文)上执行删除操作。只需先找到匹配的实例并删除它
如果你能提供更多的细节/代码,我也许能提供一个具体的例子,但你现在应该有足够的时间继续下去。你是如何填写数据视图的?根据错误消息,您试图删除一个未附加到上下文的实体,因此您可能在某个地方创建了该实体的副本?请将这段代码发布在充装数据视图的充电器中。我已经添加了您要求的代码。虽然很痛苦,但我已设法解决了所有问题。你的提示非常有用,所以谢谢你的帮助。干杯