2013-09-20 3 views
2

Я пытаюсь отобразить структуру структуры базы данных через nhibernate, но все внешние ключи поступают без действий (по умолчанию это ограничение). Например:Настройка NHibernate Свободно для каскадного действия.

constraint FK8BB739C23BE3416E foreign key (auction_ID) references "auctions" 

HasMany with 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

Если вы хотите уровня базы данных "на удалениях каскада" действия вы должны добавить 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, чтобы получить подробную информацию о каскадах NHiberate.

Смежные вопросы