Código de relacionamento recursivo muitos-para-muitos auto-referência primeiro Entity Framework

Eu não consigo fazer isso funcionar

class Member { public virtual IList Friends { get; set; } [Key] public int MemberId { get; set; } public string Name{ get; set; } } 

Eu tentei adicionar mapeamentos, mas em vão. Existe uma maneira de fazer isso com CTP5?

Por convenção, o Code First tomará associações unidirecionais como uma para muitas. Portanto, você precisa usar uma API fluente para informar ao Code First que deseja ter uma associação de autoatendimento muitos:

 protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity().HasMany(m => m.Friends).WithMany(); } 

Nota: Há um bug conhecido no CTP5 que não permite personalizar os nomes das colunas da tabela de junit nesse cenário.

Se eu estiver correto, você pode influenciar o nome muitos para muitos da tabela com este código:

 protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity().HasMany(m => m.Friends).WithMany().Map(m => { m.MapLeftKey("MemberId"); m.MapRightKey("FriendId"); m.ToTable("MembersFriends"); } ); } 

espero que isto ajude.

Você pode fazer isso funcionar no EF 4 CTP5 usando Model-First, mas o CTP5 Code First possui muitos bugs com configurações de consulta auto-referenciais e polimórficas para usar o Code First em tais cenários. Morteza Manavi (veja outra resposta) documentou vários deles em seu blog.

Seu exemplo não é um relacionamento muitos-para-muitos, é mais um relacionamento recursivo.

Não sei como consertar isso. Mas o problema com o seu código é que você terá dois campos na mesma linha com o mesmo nome. MemberId para o id da linha e MemberId para o id do amigo.

Editar

Tente fazer assim:

  class Member { [Key] public int MemberId { get; set; } public string Name { get; set; } public virtual IList Friends { get; set; } } class FriendRelationship { [Key] public int RelationshipId { get; set; } public Member Friend { get; set; } }