我正在尝试在我的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”红色标记,错误为“无法解析符号'列'”。所以我不确定我的语法是完全错误的,还是我在某个地方遗漏了某些东西。
答案 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");