2012-12-13 106 views
2

我需要用流利的NHibernate的实施项目和ProjecSettings之间的一个一对一的关联:NHibernate的一对一外键DELETE CASCADE

public class ProjectMap : ClassMap<Project> 
{ 
    public ProjectMap() 
    { 
     Id(x => x.Id) 
     .UniqueKey(MapUtils.Col<Project>(x => x.Id)) 
     .GeneratedBy.HiLo("NHHiLoIdentity", "NextHiValue", "1000", 
      string.Format("[EntityName] = '[{0}]'", MapUtils.Table<Project>())) 
     .Not.Nullable(); 

     HasOne(x => x.ProjectSettings) 
     .PropertyRef(x => x.Project); 
    } 
} 

public class ProjectSettingsMap : ClassMap<ProjectSettings> 
{ 

    public ProjectSettingsMap() 
    { 

     Id(x => x.Id) 
     .UniqueKey(MapUtils.Col<ProjectSettings>(x => x.Id)) 
     .GeneratedBy.HiLo("NHHiLoIdentity", "NextHiValue", "1000", 
      string.Format("[EntityName] = '[{0}]'", MapUtils.Table<ProjectSettings>())); 

     References(x => x.Project) 
     .Column(MapUtils.Ref<ProjectSettings, Project>(p => p.Project, p => p.Id)) 
     .Unique() 
     .Not.Nullable(); 
    } 
} 

这将导致以下SQL的项目设置:

CREATE TABLE ProjectSettings (
    Id      bigint PRIMARY KEY NOT NULL, 
    Project_Project_Id  bigint NOT NULL UNIQUE, 
    /* Foreign keys */ 
    FOREIGN KEY (Project_Project_Id) 
    REFERENCES Project() 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION 
); 

我想要实现的是为ONE DELETE CASCADE FOREIGN KEY(Project_Project_Id),以便当通过SQL查询删除项目时,它的设置也被删除。我怎样才能做到这一点?

编辑:我知道Cascade.Delete()选项,但它不是我所需要的。有什么方法可以拦截FK语句生成?

回答

1

看来Fluent-NHibernate不能做到这一点。

你可以这样做:

HasOne(x => x.ProjectSettings).PropertyRef(x => x.Project).Cascade.Delete(); 

这将工作打算,但DDL不会改变,FNH将处理级联编程而不是使用DB引擎。

+0

我知道Cascade.Delete(),但它不是我所需要的。有什么方法可以拦截FK语句生成? – xll

+0

不符合FNH,没有。你可以尝试在NHibernate配置中使用NHibernate.Mapping.IAuxiliaryDatabaseObject,这可能会做到这一点,但据我所知,FNH没有回答这个问题。 –

+0

恩,谢谢你指出方向。虽然我希望有一个更简单的方法。 – xll