Fluent nhibernate fluent nhibernate有一个外键不工作的

Fluent nhibernate fluent nhibernate有一个外键不工作的,fluent-nhibernate,Fluent Nhibernate,无论何时加载任务类,Document属性始终为null,尽管数据库中存在数据 任务类: public class Task { public virtual Document Document { get; set; } AutoPersistenceModel的任务映射覆盖: public void Override(AutoMap<Task> mapping) { mapping.HasOne(x => x.Document) .WithF

无论何时加载任务类,Document属性始终为null,尽管数据库中存在数据

任务类:

public class Task
{
    public virtual Document Document { get; set; }
AutoPersistenceModel的任务映射覆盖:

public void Override(AutoMap<Task> mapping)
{
    mapping.HasOne(x => x.Document)
        .WithForeignKey("Task_Id");
应该是:

FROM   [Task] this_
    left outer join [Document] document2_
    on this_.Id = document2_.Task_Id
如果我破解数据库中的数据以便ID匹配,那么就加载了数据,但显然这是不正确的-但至少它证明了它加载了数据

编辑:在fluent nhib源代码中查找XML会产生以下结果:

<one-to-one foreign-key="Task_Id" cascade="all" name="Document" class="MyProject.Document, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
有人有什么想法吗

谢谢


Andrew

我认为这里的问题是“HasOne”约定意味着你指向了另一件事(标准的关系方式是说“多对一”/“一对一”);通过在文档上放置一个任务ID,实际关系是一个HasMany,但您有某种隐含的理解,即每个任务只有一个文档

抱歉-我不知道如何解决这个问题,但我很想知道解决方案是什么(我不使用NHibernate或Fluent NHibernate,但我一直在研究它以备将来使用)。一个解决方案(来自一个不太了解的人)是将文档作为任务的集合,然后提供一个文档属性,返回集合中的第一个文档属性(使用一个隐藏文档属性的接口,这样就没有人认为他们可以向其中添加新项)

查看文档并考虑eulerfx的答案,可能方法如下:

References(x => x.Document)
    .TheColumnNameIs("ID")
    .PropertyRef(d => d.Task_ID);
编辑:这样这个答案就有了合适的解决方案:正确的路径是更新数据库模式以匹配代码的意图。这意味着向任务表中添加一个DocumentID,因此任务和文档之间存在多对一关系。如果无法更改架构,则References()将是合适的解决方案。

您应该使用:


参考文献(x=>x.文档,“DocumentIdColumnOnTask”)

正如eulerfx所指出的

表结构表明一个任务可能有多个文档

克里斯说:

通过在文档上放置一个任务ID,实际关系是一个HasMany,但您有某种隐含的理解,即每个任务只有一个文档

这当然是正确的,所以我将其反转,以便任务具有可为空的文档Id

谢谢你们两位的帮助


我掷硬币决定接受答案,如果我能两个都打勾,我会的

我今天遇到了同样的问题。我相信诀窍不是将.ForeignKey(…)与.HasOne映射一起使用,而是使用.PropertyRef(…)。以下是我如何定义组织(母公司)及其管理人员(子公司)之间的一对一关系:

管理员使用外键对组织进行简单的引用:

References(x => x.Organisation, "ORAD_FK_ORGANISATION").Not.Nullable();

检索组织时,这将加载正确的管理记录,并正确级联更新和删除。

我一直在努力解决这一问题,但有一个问题,最后发现这是有效的:

public class ParentMap : ClassMap<Parent>
{
    public ParentMap()
    {
        Id(x => x.Id);
        HasOne(s => s.Child).Cascade.All();
    }
}

 public class ChildMap : ClassMap<Model.Child>
{
    public ChildMap()
    {
        Id(x => x.Id);
        HasOne(s => s.Parent).Constrained().ForeignKey();           
    }
}
公共类父映射:类映射
{
公共ParentMap()
{
Id(x=>x.Id);
HasOne(s=>s.Child).Cascade.All();
}
}
公共类ChildMap:ClassMap
{
公共儿童地图()
{
Id(x=>x.Id);
HasOne(s=>s.Parent).Constrained().ForeignKey();
}
}

我尝试过这个解决方案:

仅在文件中:

mapping.HasOne(x => x.Task).ForeignKey("Task_ID").Constrained().Cascade.All();

我同意这种可能性,但是为什么任务没有被渲染到任何地方呢?(即使它是错误的,因此会导致异常-但它不起作用)这确实有效,但这意味着我需要文档上的Task_id属性,而我不希望有它。虽然thankstblDocument有任务Id,但暂时有效,而不是tblTask有文档Id,ok遗漏了该部分。那么我认为在任务表上有一个docID是最有意义的。否则,表结构表明一个任务可能有多个文档。是的,我想是这样。这是有原因的,但我不记得为什么了。我会考虑并考虑扭转局面。tahey andrew,印尼国家电力公司在迪福找到答案。我想说,通过重新做db,你实际上做了正确的事情。但有时您无法更改DB,而这正是Fluent映射真正发挥作用的地方。HasOne就是这样一个功能,你和我都没有正确地使用它。印尼国家电力公司指出了正确的使用方法。。。我的2个世纪似乎是完美的答案将是这个和克里斯·沙弗的答案相结合。这个答案提供了一个使用Fluent NHibernate的工作实现,Chris Shaffer提供了一点关于为什么初始实现不起作用的“理论”。这也为我工作,非常感谢。但是HasOne().ForeignKey()的作用是什么?+1但我必须将引用作为引用(x=>x.organization)。ForeignKey(“ORAD_FK_organization”)。Not.Nullable();由于它将外键名称作为组织的列名,如何在两个表中使用compositeid?
References(x => x.Organisation, "ORAD_FK_ORGANISATION").Not.Nullable();
public class ParentMap : ClassMap<Parent>
{
    public ParentMap()
    {
        Id(x => x.Id);
        HasOne(s => s.Child).Cascade.All();
    }
}

 public class ChildMap : ClassMap<Model.Child>
{
    public ChildMap()
    {
        Id(x => x.Id);
        HasOne(s => s.Parent).Constrained().ForeignKey();           
    }
}
mapping.HasOne(x => x.Task).ForeignKey("Task_ID").Constrained().Cascade.All();