2

我正在尝试通过 nhibernate 映射数据库结构结构,但所有外键都没有操作(默认为限制)。例如:

constraint FK8BB739C23BE3416E foreign key (auction_ID) references "auctions"

HasMany 与 Inverse 也无济于事。也许我错过了映射中的一些基本内容。这是正确的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

如果您想要数据库级别的“删除级联”操作,您应该将ForeignKeyCascadeOnDelete添加到您的映射中。

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

您还可以使用 NHibernate 级联:

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

这样,如果您在应用程序中删除对象(通过 NHibernate ISession.Delete()),NHibernate 将为子集合中的对象发出删除语句。您可以访问NHibernate Cascades以获取有关 NHibernate 级联的详细信息。

于 2013-09-28T16:22:53.933 回答