2015-06-05 4 views
10

Я пытаюсь сопоставить свойства того же типа в ассоциации OneToMany. Я попытался отличить от описания, но вроде бы застрял здесь.Сопоставление нескольких свойств одного и того же типа с помощью HasMany с помощью автонастройки

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(); 
     } 
    } 
+0

Возможно, я ищу что-то вроде MappedBy в NHibernate – Mert

+0

Является ли это Entity Framework? Вам нужно простое сопоставление от одного до многих или что-то более конкретное? –

+0

nhibernate помечен, и вы спрашиваете, является ли это EF? вероятно, вы не можете ответить на это. – Mert

ответ

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

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