FluentNHibernate映射需要帮助

时间:2010-11-10 16:07:08

标签: nhibernate fluent-nhibernate nhibernate-mapping

我有以下实体

alt text

我试图在FluentNHibernate的帮助下映射它们。

关于实体的一些注释:

  • CreatedBy实体上的属性AssignedToTask属于Person类型,在数据库方面,属于分别调用CreatorID和{{1}的int列}
  • 实体AssigneeID上的属性WrittenBy属于Person类型,它在数据库上的Note
  • 列上保留

我不会在这里包含所有映射,因为它可能不需要,但是当我添加Task和Note映射时,我遇到的最大问题就出来了。

现在实际上如果我尝试向Person对象添加一个地址NHibernate尝试执行以下查询

AuthorID

我错在哪里?

编辑:添加了实体的映射

UPDATE Addresses SET AuthorID = @p0 WHERE AddressID = @p1;

编辑2 :导出映射后(感谢dotjoe)我发现许多奇怪的结果如下所示

public PersonMap() {
    Table( "Persons" );
    Id( c => c.PersonID ).Column( "PersonID" ).GeneratedBy.Identity();
    References( c => c.Company ).Column( "CompanyID" );
    HasMany( c => c.Addresses ).Cascade.SaveUpdate();
    HasMany( c => c.TasksAsCreator ).Cascade.SaveUpdate();
    HasMany( c => c.TasksAsAssignee ).Cascade.SaveUpdate();
    HasMany( c => c.NotesAsAuthor ).Cascade.SaveUpdate();
}

public TaskMap() {
    Table( "Tasks" );
    Id( i => i.TaskID ).Column( "TaskID" ).GeneratedBy.Identity();
    References( i => i.Company ).Column( "CompanyID" );
    References( i => i.CreatedBy ).Column( "CreatorID" );
    References( i => i.AssignedTo ).Column( "AssigneeID" );
    HasMany( i => i.Notes ).Cascade.SaveUpdate();
}

public NoteMap() {
    Table( "Notes" );
    Id( n => n.NoteID ).Column( "NoteID" ).GeneratedBy.Identity();
    References( n => n.Task ).Column( "TaskID" );
    References( n => n.WrittenBy ).Column( "AuthorID" );
}

这是完全错误的!并没有反映上面显示的映射....

2 个答案:

答案 0 :(得分:2)

您能否显示与Person实体相关的属性的映射?我会确保在Note / Task to Person映射的两边(Reference和HasMany)指定相同的fk列名。我以前见过这个......我认为这是Fluent中的一个错误,当它在另一个映射上使用先前指定的列名作为类型时。另外,请确保您拥有最新版本的Fluent。

要进行故障排除,您可以使用FluentMappingsContainer的ExportTo方法查看生成的xml映射...

var factory = Fluently.Configure()
                .Mappings(mc =>
                    mc.FluentMappings.AddFromAssemblyOf<PersonMap>().ExportTo("."))
                .BuildSessionFactory();

答案 1 :(得分:1)

我不确定Fluent nHibernate从哪里获取CreatorID列名称,但根据the docs,您可以使用方法KeyColumn

指定它
HasMany( c => c.NotesAsAuthor ).KeyColumn("AuthorId").Cascade.SaveUpdate();

我没有在我面前的测试项目,所以试一试,让我知道它是否有效。