Отображение нескольких свойств одного и того же типа с помощью HasMany с помощью автопилота

Я пытаюсь сопоставить свойства одного и того же типа в ассоциации 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();
        }
    }

Ответ 1

Для одного-многих отношений я обычно использую кодирование, например:

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;}

}
  • Попробуйте использовать ICollection вместо IList - это решило многие проблемы для меня.
  • Добавить имена столбцов внешнего ключа; он упрощает сопоставление и фильтрацию в запросах.