2015-06-05 30 views
10

Próbuję odwzorować właściwości tego samego typu na skojarzenie OneToMany. Próbowałem odróżnić od opisu, ale trochę utknąłem tutaj.Mapowanie wielu właściwości tego samego typu z HasMany poprzez automapowanie

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

Może szukam czegoś takiego jak MappingBy w NHibernate – Mert

+0

Czy to Entity Framework? Czy chcesz prosty jeden do wielu mapowania lub coś bardziej konkretnego? –

+0

nhibernate oznaczone i pytasz, czy to jest EF? prawdopodobnie nie masz kwalifikacji, aby odpowiedzieć na to pytanie. – Mert

Odpowiedz

1

Dla jednego do wielu relacji ja zazwyczaj używają kodowania jak:

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. spróbuje użyć ICollection zamiast IList - to rozwiązać wiele problemów dla mnie.
  2. Dodaj nazwy kolumn obcego klucza; upraszcza mapowanie i ułatwia filtrowanie zapytań.