1

ResourcePackageクラスとクラスがありますPackageItem

public ResourcePackageMap()
{
    DiscriminatorValue((int)ResourceObjectType.Package);

    HasMany(x => x.Children).KeyColumn("AggregationObjectId").Cascade.AllDeleteOrphan();
}

public PackageItemMap()
{
    Id(x => x.Id, "AggregationLinkId");
    References(x => x.ResourceItem, "ChildObjectId");
    References(x => x.Package, "AggregationObjectId");
    Map(x => x.Order, "OrderWithinAggregation");
    Map(x => x.Usage, "Usage");

    Table("tbl_Object_Aggregation_Link");
}

次のようなエラーが表示されました。

コレクションを削除できませんでした: [Domain.ResourcePackage.Children#102c589b-fc1c-451d-8300-a0ef00baa21f][SQL:
UPDATE tbl_Object_Aggregation_Link SET AggregationObjectId = null WHERE AggregationObjectId = @p0]

NHibernate.Exceptions.GenericADOException: コレクションを削除できませんでした:
[Domain.ResourcePackage.Children#102c589b-fc1c-451d-8300-a0ef00baa21f]
[SQL: UPDATE tbl_Object_Aggregation_Link SET AggregationObjectId = null WHERE
AggregationObjectId = @p0] ---> System.Data.SqlClient.SqlException:
値 NULL を列 'AggregationObjectId' に挿入できません。
テーブル 'KDatabase.dbo.tbl_Object_Aggregation_Link';
列はヌルを許可しません。
更新は失敗します。ステートメントは終了されました。

リレーションシップ テーブルは次のように実行されます。

tbl_Object テーブルと、tbl_Object テーブルへの 2 つの外部キーを含む tbl_Object_Aggregation_Link テーブルがあります。

tbl_Object_Aggregation_Link テーブルのマッピング クラスは次のとおりです。

public class PackageItemMap : ClassMap<PackageItem>
{
    public PackageItemMap()
    {
        Id(x => x.Id, "AggregationLinkId");
        References(x => x.ResourceItem, "ChildObjectId");
        References(x => x.Package, "AggregationObjectId");
        Map(x => x.Order, "OrderWithinAggregation");
        Map(x => x.Usage, "Usage");

        Table("tbl_Object_Aggregation_Link");
    }
}
4

1 に答える 1

0

どちらかが変わる

       HasMany(x => x.Children).KeyColumn("AggregationObjectId").Cascade.AllDeleteOrphan()

       HasMany(x => x.Children).KeyColumn("AggregationObjectId").Cascade.All()

または、テーブル内の両方の外部キーを作成して、'tbl_Object_Aggregation_Link'NULL 値を受け入れるようにします。

編集(別の解決策):

マップの審査:

References(x => x.Package, "AggregationObjectId");

プロパティ (Package) を null として渡し、データベースがこの外部キーに null を許可していないか、このパッケージの Id がデータベースに存在しないと推測できます。したがって、列"AggregationObjectId"が null を受け入れるようにするか、有効なパッケージ オブジェクトを渡す (Nhibernate を使用して取得して渡すことができます) か、次のようにマップを作成します。

 References(x => x.Package, "AggregationObjectId").Cascade.All();

ただし、データベースにパッケージが見つからない場合は、パッケージが自動的に保存されます。

于 2012-10-22T05:08:15.237 に答える