如何在nHibernate中将两个表相互映射

时间:2015-03-04 17:58:09

标签: c# nhibernate model-view-controller

我正在尝试在我的MVC项目中的两个表之间建立一个查找,其中nHibernate正在大量使用。我已经映射了两个表,只要我将它们视为单独的实体,它就能很好地工作。但是现在我需要更远的能力,同时加载table1以从一对一的映射中提取table2中的数据。

Lead.cs

using System;
using FluentNHibernate.Mapping;

namespace SMSService.Models
{
    //Table One
    public class Leads
    {
        public virtual int Id { get; set; }
        public virtual string FirstName { get; set; }
        public virtual string LastName { get; set; }
        public virtual string TaskName { get; set; }

        //The second table
        public virtual Workflow Workflow { get; set; }
    }

    public class LeadsClassMap : ClassMap<Leads>
    {
        public LeadsClassMap()
        {
            Table("Leads");
            Id(x => x.Id).GeneratedBy.Native();
            Map(x => x.FirstName);
            Map(x => x.LastName);
            Map(x => x.TaskName);

            //My attempt to join the tables
            HasOne(x => x.Workflow).Column("LeadId");
        }
    }
}

Workflow.cs

using System;
using FluentNHibernate.Mapping;

namespace SMSService.Models
{
    //Table Two
    public class Workflow
    {
        public virtual int Id { get; set; }
        public virtual int LeadId { get; set; }
        public virtual bool PreviouslySubmitted { get; set; }
        public virtual Guid SubmittedBy { get; set; }
        public virtual DateTime Modified { get; set; }
        public virtual int WorkflowStep { get; set; }
    }

    public class WorkflowClassMap : ClassMap<Workflow>
    {
        public WorkflowClassMap()
        {
            Table("Workflow");
            Id(x => x.Id).GeneratedBy.Native();
            Map(x => x.LeadId);
            Map(x => x.PreviouslySubmitted);
            Map(x => x.SubmittedBy);
            Map(x => x.Modified);
            Map(x => x.WorkflowStep);
        }
    }
}

我的目标是,在使用它时,我可以使用一个方法来调用Leads,还有Workflows,这样我就可以做类似的事情:

foreach (var lead in Leads) {
    var prevSubmitted = lead.Workflow.PreviouslySubmitted;
}

然而,我遇到的第一个问题是我在代码中出现“.Column”红色标记,错误为“无法解析符号'列'”。所以我不确定我的语法是完全错误的,还是我在某个地方遗漏了某些东西。

2 个答案:

答案 0 :(得分:0)

这似乎不是真正的一对一关系。真正的一对一关系共享相同的主键,而不是这里的情况。

这似乎是多对一,而应该如下所示进行映射。我也会说,通常我不会只映射id列。如果这是数据库中的外键,则它应该与实际的nhibernate实体绑定,而不仅仅是id。在nhibernate中进行查询时,这变得非常宝贵。我在Workflow类中更改了LeadId以匹配它。

public class Leads
{
    public virtual int Id { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual string TaskName { get; set; }

    //The second table
    public virtual IList<Workflow> Workflows { get; set; }
}

public class LeadsClassMap : ClassMap<Leads>
{
    public LeadsClassMap()
    {
        Table("Leads");
        Id(x => x.Id).GeneratedBy.Native();
        Map(x => x.FirstName);
        Map(x => x.LastName);
        Map(x => x.TaskName);

        //My attempt to join the tables
        HasMany(x => x.Workflows)
            .KeyColumn("LeadId")
            .Cascade.All();
    }
}

public class Workflow
{
    public virtual int Id { get; set; }
    public virtual Leads Lead { get; set; }
    public virtual bool PreviouslySubmitted { get; set; }
    public virtual Guid SubmittedBy { get; set; }
    public virtual DateTime Modified { get; set; }
    public virtual int WorkflowStep { get; set; }
}

public class WorkflowClassMap : ClassMap<Workflow>
{
    public WorkflowClassMap()
    {
        Table("Workflow");
        Id(x => x.Id).GeneratedBy.Native();
        References(x => x.Lead, "LeadId");
        Map(x => x.PreviouslySubmitted);
        Map(x => x.SubmittedBy);
        Map(x => x.Modified);
        Map(x => x.WorkflowStep);
    }
}

答案 1 :(得分:0)

在这种情况下,一对一映射不起作用,因为它们没有使用相同的Id,因此一种方法是修复,

References(x => x.Workflow).Column("LeadId");