我有以下实体
我试图在FluentNHibernate的帮助下映射它们。
关于实体的一些注释:
CreatedBy
实体上的属性AssignedTo
和Task
属于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" );
}
这是完全错误的!并没有反映上面显示的映射....
答案 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();
我没有在我面前的测试项目,所以试一试,让我知道它是否有效。