我试图通过nhibernate映射数据库结构结构,但所有外键都没有动作(默认为restrict)。例如:
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();
}
}
答案 0 :(得分:4)
如果您想要数据库级别“删除级联”操作,您应该将 ForeignKeyCascadeOnDelete 添加到您的映射中。
HasMany(x => x.TaskAuctions).KeyColumn("auction_ID").ForeignKeyCascadeOnDelete()
你也可以使用NHibernate级联:
HasMany(x => x.TaskAuctions).KeyColumn("auction_ID").Cascade.AllDeleteOrphan()
这样,如果删除应用程序中的对象(通过NHibernate ISession.Delete()),NHibernate将为子集合中的对象发出delete语句。您可以访问NHibernate Cascades以获取有关NHiberate级联的详细信息。