2

nhibernate を介してデータベース構造構造をマップしようとしていますが、すべての外部キーはアクションなしで取得されます (デフォルトは制限です)。例えば:

constraint FK8BB739C23BE3416E foreign key (auction_ID) references "auctions"

Inverse を使用した HasMany も役に立ちませんでした。おそらく、マッピングの基本的なことを見逃していたのでしょう。正しい sqlite 構造は次のとおりです。

CREATE TABLE auctions (
    ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    auction_name TEXT NOT NULL,
);

CREATE TABLE tasks (
    ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    task_name TEXT NOT NULL
);

CREATE TABLE task_searchstrings (
    ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    searchstring TEXT,
    task_ID INTEGER UNSIGNED NOT NULL,
    FOREIGN KEY (task_ID)
        REFERENCES tasks(ID)
        ON UPDATE CASCADE ON DELETE CASCADE
);

CREATE TABLE task_auctions (
    ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    auction_ID INTEGER UNSIGNED NOT NULL,
    searchstring_ID INTEGER UNSIGNED NOT NULL,
    FOREIGN KEY (auction_ID)
        REFERENCES auctions(ID)
        ON UPDATE CASCADE ON DELETE CASCADE,
    FOREIGN KEY (searchstring_ID)
        REFERENCES task_searchstrings(ID)
        ON UPDATE CASCADE ON DELETE CASCADE
);

CREATE UNIQUE INDEX unique_task_auctions ON task_auctions (auction_ID, searchstring_ID);

マップ クラスのコード:

public class auctions
{
    public virtual UInt32 ID { get; set; }
    public virtual string auction_name { get; set; }
    public virtual IList<task_auctions> TaskAuctions { get; set; }
}

public class task_auctions
{
    public virtual UInt32 ID { get; set; }
    public virtual UInt32 auction_ID { get; set; }
    public virtual UInt32 searchstring_ID { get; set; }
    public virtual auctions Auction { get; set; }
    public virtual task_searchstrings TaskSearchstring { get; set; }
}

public class task_searchstrings
{
    public virtual UInt32 ID { get; set; }
    public virtual string searchstring { get; set; }
    public virtual UInt32 task_ID { get; set; }
    public virtual tasks Task { get; set; }
    public virtual IList<task_auctions> TaskAuctions { get; set; } 
}

public class tasks
{
    public virtual UInt32 ID { get; set; }
    public virtual string task_name { get; set; }
    public virtual IList<task_searchstrings> TaskSearchstrings { get; set; } 
}

そして私のマッピング:

class auctionsMap : ClassMap<auctions>
{
    public auctionsMap()
    {
        Id(x => x.ID).GeneratedBy.Assigned().Not.Nullable();
        LazyLoad();
        Map(x => x.auction_name).Not.Nullable();
        HasMany(x => x.TaskAuctions).KeyColumn("auction_ID").Cascade.All();
    }
}

class task_auctionsMap : ClassMap<task_auctions>
{
    public task_auctionsMap()
    {
        Id(x => x.ID).GeneratedBy.Assigned().Not.Nullable();
        Map(x => x.auction_ID).Not.Nullable().UniqueKey("unique_task_auctions");
        Map(x => x.searchstring_ID).Not.Nullable().UniqueKey("unique_task_auctions");
        References(x => x.Auction, "auction_ID").Not.Insert().Not.Update();
        References(x => x.TaskSearchstring, "searching_ID").Not.Insert().Not.Update();
    }
}

class task_searchstringsMap : ClassMap<task_searchstrings>
{
    public task_searchstringsMap()
    {
        Id(x => x.ID).GeneratedBy.Assigned().Not.Nullable();
        Map(x => x.searchstring);
        Map(x => x.task_ID).Not.Nullable();
        References(x => x.Task, "task_ID").Not.Insert().Not.Update();
        HasMany(x => x.TaskAuctions).KeyColumn("searching_ID");
    }
}

class tasksMap : ClassMap<tasks>
{
    public tasksMap()
    {
        Id(x => x.ID).GeneratedBy.Assigned().Not.Nullable();
        Map(x => x.task_name).Not.Nullable();
        HasMany(x => x.TaskSearchstrings).KeyColumn("task_ID").Cascade.All();
    }
}
4

1 に答える 1

5

データベース レベルの"on delete cascade" アクションが必要な場合は、ForeignKeyCascadeOnDelete をマッピングに追加する必要があります

HasMany(x => x.TaskAuctions).KeyColumn("auction_ID").ForeignKeyCascadeOnDelete()

NHibernate カスケードを使用することもできます。

HasMany(x => x.TaskAuctions).KeyColumn("auction_ID").Cascade.AllDeleteOrphan()

このように、アプリケーションで (NHibernate ISession.Delete() を使用して) オブジェクトを削除すると、NHibernate は子コレクション内のオブジェクトに対して削除ステートメントを発行します。NHibernate カスケードにアクセスして、 NHibernate カスケードに関する詳細情報を取得できます。

于 2013-09-28T16:22:53.933 に答える