FluentNHibernate映射需要帮助

FluentNHibernate映射需要帮助,nhibernate,fluent-nhibernate,nhibernate-mapping,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,我有以下实体 我正试图在FluentNHibernate的帮助下绘制它们的地图 关于实体的一些说明: 在任务实体上,由创建的属性和分配给的属性属于Person类型,在数据库端,是分别称为创建者ID和分配ID 实体Note上的属性writenby为Person类型,它在数据库中名为AuthorID 我不打算在这里包括所有映射,因为它可能不是必需的,但是当我添加任务和注释映射时,我面临的最大问题就出现了 事实上,如果我尝试向Person对象添加地址,请尝试执行以下查询 UPDATE Addre

我有以下实体

我正试图在FluentNHibernate的帮助下绘制它们的地图

关于实体的一些说明:

  • 任务
    实体上,由创建的
    属性和分配给
    属性属于Person类型,在数据库端,是分别称为
    创建者ID
    分配ID
  • 实体
    Note
    上的属性
    writenby
    为Person类型,它在数据库中名为
    AuthorID
我不打算在这里包括所有映射,因为它可能不是必需的,但是当我添加任务和注释映射时,我面临的最大问题就出现了

事实上,如果我尝试向Person对象添加地址,请尝试执行以下查询

UPDATE Addresses SET AuthorID = @p0 WHERE AddressID = @p1;
我错在哪里

编辑:添加实体的映射

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:导出映射后(多亏了dotjoe),我发现了许多奇怪的结果,如下所示

<bag cascade="save-update" name="NotesAsAuthor" mutable="true">
  <key>
    <column name="CreatorID" />
  </key>
  <one-to-many class="Note, GSLConverter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>


这是完全错误的并且不反映上面显示的映射…

能否显示与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();
var factory=fluntly.Configure()
.Mappings(mc=>
mc.FluentMappings.AddFromAssemblyOf().ExportTo(“.”)
.BuildSessionFactory();

我不确定Fluent nHibernate从何处获取
创建者ID
列名,但根据您的情况,可以使用方法
KeyColumn

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

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

谢谢您的回复。我已根据您的要求编辑了我的问题。您所说的
是什么意思?我会确保您在个人便笺/任务的两侧指定相同的fk列名(Reference和HasMany)
HasMany
没有
Column()
方法。你能给我一个例子吗?HasMany有
ForeignKeyColumn()
…我相信如果没有指定,它将默认为“classname\u id”。您应该在Fluent配置上使用
ExportTo
方法来查看生成的xml映射文件。可能有助于排除故障。感谢您提供有关出口的提示。你能看一下我的最新编辑吗?这不是又一次的问题吗?不完全相同,但非常相似。即使在这一点上,您也能提供帮助吗?请您添加Notes映射,如您所述,这包含
AuthorId
?完成。感谢您的关注。我想说的是,这种错误有时甚至会出现在人员和任务之间的关系上,以及由创建和分配到的字段上。我在每个映射类上执行的操作一定是错误的…:(谢谢!我刚刚做了,正在做一个测试。它似乎很有效。我花了很多时间,因为我的模型相当大。我真的不明白,如果你不在两侧指定正确的列,为什么它会变得如此随机。再次感谢你的时间:)