C# Fluent nHibernate Id是一个参考

C# Fluent nHibernate Id是一个参考,c#,.net,nhibernate,fluent-nhibernate,C#,.net,Nhibernate,Fluent Nhibernate,我遇到了两个表共享同一个键的情况,让我们说ID。当我用FluentMapping映射这两个表时,我如何为我希望ID实际映射到对象的类进行映射 public class First { public virtual int Id {get; set;} public virtual string Name {get; set; } } public class Second { public virtual First First {get; set;} pub

我遇到了两个表共享同一个键的情况,让我们说ID。当我用FluentMapping映射这两个表时,我如何为我希望ID实际映射到对象的类进行映射

public class First
{
    public virtual int Id {get; set;}
    public virtual string Name {get; set; }
}


public class Second
{
    public virtual First First {get; set;}
    public virtual int Number {get; set; }
}

如何绘制第二类地图?第二个表也有一个ID,但它是第一个表ID的外键。

就像Sjonny说的,这听起来像是继承,它会

class First
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}

class Second : First
{
    public virtual int Number { get; set; }
}

class FirstMap : ClassMap<First>
{
    public FirstMap()
    {
        Id(f => f.Id).GeneratedBy.HiLo("100");

        Map(f => f.Name);
    }
}

class SecondMap : SubclassMap<Second>
{
    public SecondMap()
    {
        KeyColumn("Id");

        Map(s => s.Number);
    }
}
第一类
{
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
}
第二班:第一班
{
公共虚拟整数{get;set;}
}
类FirstMap:ClassMap
{
公共FirstMap()
{
Id(f=>f.Id).GeneratedBy.HiLo(“100”);
Map(f=>f.Name);
}
}
类SecondMap:子类map
{
公共地图()
{
键列(“Id”);
地图(s=>s.Number);
}
}
但是您的场景也是可能的,但是您需要额外的工作,并且在以后的代码中不是很好

class SecondMap : ClassMap<Second>
{
    public SecondMap()
    {
        CompositeId()
            .KeyReference(f => f.First, "Id");

        Map(s => s.Number);
    }
}

class Second
{
    public virtual First First {get; set;}
    public virtual int Number { get; set; }

    // required for Compositekeys
    public override bool Equals(object obj)
    {
        var other = obj as Second;
        return (other != null) && (First.Id == other.First.Id) ;
    }

    // required for Compositekeys
    public override int GetHashCode()
    {
        return First.Id.GetHashCode();
    }
}
classsecondmap:ClassMap
{
公共地图()
{
复合ID()
.KeyReference(f=>f.First,“Id”);
地图(s=>s.Number);
}
}
二等
{
公共虚拟第一{get;set;}
公共虚拟整数{get;set;}
//合成键需要
公共覆盖布尔等于(对象对象对象)
{
var other=第二个obj;
返回(other!=null)&&(First.Id==other.First.Id);
}
//合成键需要
公共覆盖int GetHashCode()
{
首先返回.Id.GetHashCode();
}
}

就像Sjonny说的,这听起来真的像是继承,它会

class First
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}

class Second : First
{
    public virtual int Number { get; set; }
}

class FirstMap : ClassMap<First>
{
    public FirstMap()
    {
        Id(f => f.Id).GeneratedBy.HiLo("100");

        Map(f => f.Name);
    }
}

class SecondMap : SubclassMap<Second>
{
    public SecondMap()
    {
        KeyColumn("Id");

        Map(s => s.Number);
    }
}
第一类
{
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
}
第二班:第一班
{
公共虚拟整数{get;set;}
}
类FirstMap:ClassMap
{
公共FirstMap()
{
Id(f=>f.Id).GeneratedBy.HiLo(“100”);
Map(f=>f.Name);
}
}
类SecondMap:子类map
{
公共地图()
{
键列(“Id”);
地图(s=>s.Number);
}
}
但是您的场景也是可能的,但是您需要额外的工作,并且在以后的代码中不是很好

class SecondMap : ClassMap<Second>
{
    public SecondMap()
    {
        CompositeId()
            .KeyReference(f => f.First, "Id");

        Map(s => s.Number);
    }
}

class Second
{
    public virtual First First {get; set;}
    public virtual int Number { get; set; }

    // required for Compositekeys
    public override bool Equals(object obj)
    {
        var other = obj as Second;
        return (other != null) && (First.Id == other.First.Id) ;
    }

    // required for Compositekeys
    public override int GetHashCode()
    {
        return First.Id.GetHashCode();
    }
}
classsecondmap:ClassMap
{
公共地图()
{
复合ID()
.KeyReference(f=>f.First,“Id”);
地图(s=>s.Number);
}
}
二等
{
公共虚拟第一{get;set;}
公共虚拟整数{get;set;}
//合成键需要
公共覆盖布尔等于(对象对象对象)
{
var other=第二个obj;
返回(other!=null)&&(First.Id==other.First.Id);
}
//合成键需要
公共覆盖int GetHashCode()
{
首先返回.Id.GetHashCode();
}
}

在这种情况下,你会说
第二个
是一种
第一个
?意思-就像
员工
是一种
,或者
经理
是一种
员工
。如果是这样的话,你会想使用继承。在这种情况下,你会说第二个
Second
是第一个
First
的一种吗?意思-就像
员工
是一种
,或者
经理
是一种
员工
。如果是这样的话,您将希望使用继承。