Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在nHibernate中将两个表相互映射_C#_Nhibernate_Model View Controller - Fatal编程技术网

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

C# 如何在nHibernate中将两个表相互映射,c#,nhibernate,model-view-controller,C#,Nhibernate,Model View Controller,在我的MVC项目中,nHibernate被大量使用,我正试图在两个表之间建立一个查找。我已经映射了这两个表,只要我将它们视为单独的实体,它们就可以很好地工作。但现在我需要,在更远处,在加载table1时以一对一的映射方式从table2中提取数据的能力 铅含量 然而,我遇到的第一个问题是,代码中的.Column标记为红色,错误为无法解析符号'Column'。因此,我不确定我的语法是否完全错误,或者我遗漏了某个关键点。这似乎不是真正的一对一关系。True一对一关系共享相同的主键,但此处的情况并非如此

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

铅含量


然而,我遇到的第一个问题是,代码中的.Column标记为红色,错误为无法解析符号'Column'。因此,我不确定我的语法是否完全错误,或者我遗漏了某个关键点。

这似乎不是真正的一对一关系。True一对一关系共享相同的主键,但此处的情况并非如此

这似乎是一个多对一的映射,应该如下所示。我还要说,通常我不只是映射id列。如果这是数据库中的外键,它应该绑定到实际的nhibernate实体,而不仅仅是一个id。在nhibernate中执行查询时,这将变得非常宝贵。我已经在工作流类中更改了下面的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);
    }
}

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

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

它实际上是1:1,只是没有强制约束。对于Lead中的每一条记录,工作流中将始终存在且只能存在一条记录。工作流具有LeadId的原因主要是因为我希望防止记录从一个表中删除时出现任何错误,而不是从另一个表中删除,这在开发环境中经常发生。我仍然不同意您的观点,即这是1-1。看一看。在任何情况下,您仍然可以将上述映射更改为Referencesx=>x.WorkFlow,LeadId,还可以将集合公共虚拟IList工作流{get;set;}更改为公共虚拟工作流{get;set;},以实现所需。如果没有什么可以阻止您在工作流中使用相同的LeadId创建多个记录,我希望最终会遇到问题。
foreach (var lead in Leads) {
    var prevSubmitted = lead.Workflow.PreviouslySubmitted;
}
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);
    }
}
References(x => x.Workflow).Column("LeadId");