0

私は現在、次の(簡略化された)クラス/データベーススキーマを持っています:

Entity          Prospect     Customer
 +- Id           +- Id        +- Id
 +- Address      +- Entity    +- Entity
 +- Name         +- ...       +- ...
 +- ...

ENTITY              PROSPECT           CUSTOMER
======              ==========         ========
ID - INT PK         ID - INT PK        ID - INT PK
ADDRESS - VARCHAR   ENTITY_ID - INT FK ENTITY_ID - INT FK
NAME - VARCHAR      ...
...

次の流暢なマッピングとともに:

PROSPECT_MAP:
Table("PROSPECT");
Id(x => x.Id).GeneratedBy.Increment();
References(x => x.Entity).Cascade.All().Fetch.Join().Column("ENTITY_ID");
...

CUSTOMER_MAP:
Table("CUSTOMER");
Id(x => x.Id).GeneratedBy.Increment();
References(x => x.Entity).Cascade.All().Fetch.Join().Column("ENTITY_ID");
...

現在、エンティティにアタッチされているものもたくさんあります (entity_id を FK として使用)。私のアプリケーションでは、見込み客が顧客になることができます。

したがって、新しい顧客を作成し、元の見込み客が使用する entity_id にリンクし (そのエンティティに関連するすべての情報が顧客に属するように)、データベースから見込み客を削除します (基本的には、プロスペクト テーブルからのエントリであり、新しく作成された顧客によって現在リンクされている子コンポーネントにはカスケードされません)

これはNHibernateで可能ですか?ProspectMap に cascade.all が必要であることに注意してください。プロスペクトをそのコンポーネントと共に削除することは、アプリのオプションのままにしておく必要があるためです。

どうもありがとう。

4

1 に答える 1

1
void UpgradeToCustomer(Prospect p)
{
    var customer = new Customer
    {
        Entity = p.Entity
    };

    p.Entity = null; // prevent cascading

    session.Delete(p);
    session.Save(customer);
}
于 2012-05-25T07:13:22.633 に答える