Fluent NHibernate:在父项和子项的多个键列上引用另一个实体

Fluent NHibernate:在父项和子项的多个键列上引用另一个实体,nhibernate,fluent-nhibernate,fluent-nhibernate-mapping,composite-primary-key,Nhibernate,Fluent Nhibernate,Fluent Nhibernate Mapping,Composite Primary Key,我试图找出一种方法,使用被引用实体和引用实体的非主键,从一个实体引用另一个实体。我有以下资料: public class UserContact { public virtual ulong ContactId { get; set;} public virtual ulong UserId { get; set; } public virtual ulong ContactUserId { get; set; } } public class EmergencyCon

我试图找出一种方法,使用被引用实体和引用实体的非主键,从一个实体引用另一个实体。我有以下资料:

public class UserContact
{
    public virtual ulong ContactId { get; set;}
    public virtual ulong UserId { get; set; }
    public virtual ulong ContactUserId { get; set; }
}

public class EmergencyContact
{
    public virtual ulong EmergencyContactId { get; set; }
    public virtual ulong UserId { get; set; }
    public virtual ulong EmergencyContactUserId { get; set; }
    public virtual UserContact EmergencyUserContact { get; set; }
}
到UserContact的映射实际上使用了一个视图,该视图最终会复制实际表上主键(ContactId)上的记录。(这是设计的。)

我有以下映射:

public class UserContactMap : ClassMap<UserContact>
{
    public UserContactMap()
    {
        Table("USER_CONTACT_VW");
        CompositeId().KeyProperty(x => x.ContactId, "CONTACT_ID")
                     .KeyProperty(x => x.UserId, "USER_ID");
        Map(x => x.ContactUserId, "CONTACT_USER_ID")
    }
}

public class EmergencyContactMap : ClassMap<EmergencyContact>
{
    public EmergencyContactMap()
    {
        Table("EMERGENCY_CONTACT");
        Id(x => x.EmergencyContactId, "EMERGENCY_CONTACT_ID");
        Map(x => x.UserId, "USER_ID");
        Map(x => x.EmergencyUserId, "EMERGENCY_USER_ID");
        References(x => x.EmergencyUserContact)//.What else goes here?       
    }
}
public类UserContactMap:ClassMap
{
公共用户ContactMap()
{
表(“用户联系方式”);
CompositeId().KeyProperty(x=>x.ContactId,“联系人ID”)
.KeyProperty(x=>x.UserId,“USER_ID”);
映射(x=>x.ContactUserId,“CONTACT\u USER\u ID”)
}
}
公共类EmergencyContactMap:ClassMap
{
公共紧急联系人地图()
{
表(“紧急联络”);
Id(x=>x.EmergencyContactId,“紧急联系人Id”);
Map(x=>x.UserId,“USER_ID”);
Map(x=>x.EmergencyUserId,“紧急用户ID”);
引用(x=>x.EmergencyUserContact)//。这里还有什么?
}
}

我需要引用EmergencyContact中的UserContact,以便EmergencyContact实体中的UserId和EmergencyUserId将映射到UserContact实体的UserId和ContactUserId列。最好的方法是什么?

如果我有关于您的表的信息,我可以提供更多帮助

请重试以下操作

public class UserContact
{
    public virtual ulong ContactId { get; set;}
    public virtual ulong UserId { get; set; }
    public virtual ulong ContactUserId { get; set; }
    public ISet<EmergencyContact> EmergencyContact { get; set; } // EmergencyContactId
}
public class EmergencyContact
{
    public virtual ulong EmergencyContactId { get; set; }
    public virtual ulong UserId { get; set; }
    public virtual ulong EmergencyContactUserId { get; set; }
    public virtual UserContact EmergencyUserContact { get; set; }
}
public class UserContactMap : ClassMap<UserContact>
{
    public UserContactMap()
    {
        Table("USER_CONTACT_VW");
        CompositeId().KeyProperty(x => x.ContactId, "CONTACT_ID").KeyProperty(x => x.UserId, "USER_ID");
        Map(x => x.ContactUserId, "CONTACT_USER_ID");

        HasMany(x => x.EmergencyContact)
        .Access.CamelCaseField(Prefix.Underscore)
        .Cascade.None()
        .Fetch.Select()
        .AsSet()
        .Inverse()
        .LazyLoad()
        .KeyColumns.Add("\"EmergencyContactId\""); 
    }
}

public class EmergencyContactMap : ClassMap<EmergencyContact>
{
    public EmergencyContactMap()
    {
        Table("EMERGENCY_CONTACT");
        Id(x => x.EmergencyContactId, "EMERGENCY_CONTACT_ID");
        Map(x => x.UserId, "USER_ID");

        References(x => x.EmergencyUserContact)
        .Access.CamelCaseField(Prefix.Underscore)
        .Cascade.None()
        .Fetch.Select()
        .Columns("\"EmergencyContactId\"");
    }
}
公共类用户联系人
{
公共虚拟ulong ContactId{get;set;}
公共虚拟ulong用户标识{get;set;}
公共虚拟ulong ContactUserId{get;set;}
public ISet EmergencyContact{get;set;}//EmergencyContactId
}
公共类紧急联系人
{
公共虚拟ulong EmergencyContactId{get;set;}
公共虚拟ulong用户标识{get;set;}
公共虚拟ulong EmergencyContactUserId{get;set;}
公共虚拟用户联系人EmergencyUserContact{get;set;}
}
公共类UserContactMap:ClassMap
{
公共用户ContactMap()
{
表(“用户联系方式”);
CompositeId().KeyProperty(x=>x.ContactId,“CONTACT_ID”).keyperty(x=>x.UserId,“USER_ID”);
Map(x=>x.ContactUserId,“CONTACT_USER_ID”);
HasMany(x=>x.EmergencyContact)
.Access.CamelCaseField(前缀.下划线)
.Cascade.None()
.Fetch.Select()
1.资产()
.Inverse()
.LazyLoad()
.KeyColumns.Add(“\”EmergencyContactId\”);
}
}
公共类EmergencyContactMap:ClassMap
{
公共紧急联系人地图()
{
表(“紧急联络”);
Id(x=>x.EmergencyContactId,“紧急联系人Id”);
Map(x=>x.UserId,“USER_ID”);
引用(x=>x.EmergencyUserContact)
.Access.CamelCaseField(前缀.下划线)
.Cascade.None()
.Fetch.Select()
.Columns(“\”EmergencyContactId\”);
}
}