gpt4 book ai didi

c# - 设置 NHibernate Fluent 进行级联操作。

转载 作者:行者123 更新时间:2023-12-02 02:49:24 24 4
gpt4 key购买 nike

我试图通过nhibernate映射数据库结构,但是所有外键都没有 Action (默认是限制)。例如:

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);

map 类代码:

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();
}
}

最佳答案

如果您想要数据库级别“删除级联”操作,您应该将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获取有关 NBerate 级联的详细信息。

关于c# - 设置 NHibernate Fluent 进行级联操作。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18915166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com