ASP.NET/C#/nHibernate アーキテクチャの使用 - がありGridView
、ObjectDataSource
delete メソッドが機能しない問題があります。
サービス層で宣言された関数を単純に使用するとRemove(T entity)
(nHibernate リポジトリを呼び出します)、GridView_RowDeleting()
メソッドが呼び出され、続いてObjectDataSource_Deleting()
が呼び出され、サービス層の関数が呼び出され、ビジネス オブジェクトが適切に削除されます。
ただし、RemoveByID(int ID)
関数を使用しようとすると、メソッドGridView_RowDeleting()
とObjectDataSource_Deleting()
メソッドが呼び出された後、サービス層が呼び出されません。
これは と関係があると思いますがObjectDataSource.DeleteParameters
、正しく理解できないようです。
以下は、GridView と ObjectDataSource のコード スニペットです。ご覧のとおり、GridView のリストにビジネス オブジェクトの主キーがpkChapter7ID
リストされています。DataKeyNames
<asp:GridView ID="gvChapter7" runat="server" DataSourceID="odsChapter7" DataKeyNames="pkChapter7ID">
<Columns>
<asp:BoundField DataField="pkChapter7ID" HeaderText="pkChapter7ID" SortExpression="pkChapter7ID"/>
...
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="odsChapter7" runat="server"
DeleteMethod="RemoveByID" OldValuesParameterFormatString="original_{0}"
SelectMethod="FindAllForProjectID" TypeName="CLS.Services.Chapter7Service">
<DeleteParameters>
<asp:Parameter Name="ID" Type="Int32" />
</DeleteParameters>
<SelectParameters>
<asp:SessionParameter Name="ID" SessionField="ProjectID" Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
そして、私の一般的なサービス層の関連部分 (nHibernate リポジトリを呼び出します。そこに到達すると正常に動作します):
[DataObjectMethod(DataObjectMethodType.Delete, false)]
public virtual void Remove(T entity)
{
_repository.Remove(entity);
}
[DataObjectMethod(DataObjectMethodType.Delete, true)]
public virtual void RemoveByID(int ID)
{
T entity = FindBy(ID);
if (entity != null)
_repository.Remove(entity);
}
DeleteParameters
_RowDeleting メソッドで設定しようとしました:
protected void gvChapter7_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
odsChapter7.DeleteParameters["ID"].DefaultValue = e.Keys["pkChapter7ID"].ToString();
}
次のように、aspx ページで ObjectDataSource コントロール パラメーターを設定するさまざまな方法があります。
<DeleteParameters>
<asp:ControlParameter ControlID="gvChapter7" Name="ID" PropertyName="SelectedDataKey" Type="Int32" />
</DeleteParameters>
誰が私が欠けているものを見ることができますか?