Fluent nhibernate 通过自动映射将同一类型的多个属性映射为HasMany

Fluent nhibernate 通过自动映射将同一类型的多个属性映射为HasMany,fluent-nhibernate,automapping,Fluent Nhibernate,Automapping,我正在尝试将同一类型的属性映射到OneToMany关联上。我试着用描述来区分,但有点困在这里了 public class User { public virtual int UserId { get; set; } public virtual string UserName { get; set; } [Description("From")] public virtual IList<Message> FromMessageList { get;

我正在尝试将同一类型的属性映射到OneToMany关联上。我试着用描述来区分,但有点困在这里了

public class User
{
    public virtual int UserId { get; set; }
    public virtual string UserName { get; set; }

    [Description("From")]
    public virtual IList<Message> FromMessageList { get; set; }

    [Description("To")]
    public virtual IList<Message> ToMessageList { get; set; }   
}

public class Message
{
    public virtual int MessageId { get; set; }
    public virtual string Text { get; set; }

    [Description("From")]
    public virtual User FromUser { get; set; }

    [Description("To")]
    public virtual User ToUser { get; set; }

}

    public class DefaultHasManyConvention : IHasManyConvention
    {
        public void Apply(IOneToManyCollectionInstance instance)
        {
            if (instance.OtherSide.Property.GetDescription() == instance.Member.GetDescription())
            {
                if (instance.Member.GetDescription() != null)
                    instance.Key.Column(instance.Member.GetDescription() + "Id");
                else
                    instance.Key.Column(instance.OtherSide.Property.Name + "Id");

                instance.Fetch.Select();
            }
        }
    }

    public class DefaultReferenceConvention : IReferenceConvention
    {
        public void Apply(IManyToOneInstance instance)
        {
            if (instance.Property.GetDescription() != null)
                instance.Column(instance.Property.GetDescription() + "Id");
            else
                instance.Column(instance.Property.Name + "Id");

            instance.Fetch.Select();
        }
    }
公共类用户
{
公共虚拟int用户标识{get;set;}
公共虚拟字符串用户名{get;set;}
[说明(“来源”)]
公共虚拟IList FromMessageList{get;set;}
[说明(“至”)]
公共虚拟IList到消息传递者{get;set;}
}
公共类消息
{
公共虚拟int MessageId{get;set;}
公共虚拟字符串文本{get;set;}
[说明(“来源”)]
公共虚拟用户FromUser{get;set;}
[说明(“至”)]
公共虚拟用户ToUser{get;set;}
}
公共类DefaultHasManyConvention:IHasManyConvention
{
public void Apply(IOneToManyCollectionInstance实例)
{
if(instance.OtherSide.Property.GetDescription()==instance.Member.GetDescription())
{
if(instance.Member.GetDescription()!=null)
instance.Key.Column(instance.Member.GetDescription()+“Id”);
其他的
instance.Key.Column(instance.OtherSide.Property.Name+“Id”);
instance.Fetch.Select();
}
}
}
公共类DefaultReferenceConvention:IReferenceConvention
{
public void Apply(IManyToOneInstance实例)
{
if(instance.Property.GetDescription()!=null)
列(instance.Property.GetDescription()+“Id”);
其他的
列(instance.Property.Name+“Id”);
instance.Fetch.Select();
}
}

对于一对多关系,我通常使用如下编码:

public class User
{
    public int UserId { get; set; }
    public string UserName { get; set; }

    [Description("From")]
    public virtual ICollection<Message> FromMessageList { get; set; }

    [Description("To")]
    public virtual ICollection<Message> ToMessageList { get; set; }  

}

public class Message
{
    public int MessageId { get; set; }
    public string Text { get; set; }

    [Description("From")]
    public virtual User FromUser { get; set; }
    // From user foreign key column
    [ForeignKey("FromUser")]
    public int FromUserId {get;set;}


    [Description("To")]
    public virtual User ToUser { get; set; }
    // ToUser foreign key column
    [ForeignKey("ToUser")]
    public int ToUserId {get;set;}

}
公共类用户
{
public int UserId{get;set;}
公共字符串用户名{get;set;}
[说明(“来源”)]
来自MessageList{get;set;}的公共虚拟ICollection
[说明(“至”)]
对消息传递者的公共虚拟ICollection{get;set;}
}
公共类消息
{
public int MessageId{get;set;}
公共字符串文本{get;set;}
[说明(“来源”)]
公共虚拟用户FromUser{get;set;}
//来自用户外键列
[外键(“FromUser”)]
public int FromUserId{get;set;}
[说明(“至”)]
公共虚拟用户ToUser{get;set;}
//ToUser外键列
[外键(“ToUser”)]
公共int ToUserId{get;set;}
}
  • 尝试使用
    ICollection
    而不是
    IList
    ——这为我解决了许多问题
  • 添加外键列名;它使映射更简单,查询中的过滤更容易

  • 也许我正在NHibernateIs中寻找类似MappedBy的东西。这个实体框架是什么?您想要简单的一对多映射还是更具体的映射?nhibernate标记,您会问这是否是EF?也许你没有资格回答这个问题。我没有看到Nhibernate的标签。它没有显示质量,它显示我只是错过了阅读标签:)冷静。