with one net many intermediate has framework first code asp c# entity-framework many-to-many code-first

c# - net - one to many entity framework



Auto referenciar código de relación recursiva de muchos a muchos primero Entity Framework (4)

Parece que no puedo hacer que esto funcione en absoluto

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

Traté de agregar Asignaciones, pero fue en vano. ¿Hay alguna manera de hacerlo con CTP5?


Por convención, Code First tomará asociaciones unidireccionales como una a muchas. Por lo tanto, debe usar una API fluida para que Code First sepa que desea tener una asociación autorreferencial de muchos a muchos:

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

Nota: Existe un error conocido en CTP5 que no le permitirá personalizar los nombres de las columnas de la tabla de unión en este escenario.


Puede hacer que esto funcione en EF 4 CTP5 utilizando Model-First, pero el CTP5 Code First tiene demasiados errores con configuraciones de consulta autorreferencial y polimórficas para usar Code First para tales escenarios. Morteza Manavi (ver otra respuesta) ha documentado varios de ellos en su blog.


Si estoy en lo cierto, puede influir en el nombre de muchas a muchas tablas con este código:

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

espero que esto ayude.


Tu ejemplo no es una relación de muchos a muchos, es más una relación recursiva.

No estoy seguro de cómo solucionarlo. Pero el problema con su código es que obtendrá dos campos en la misma fila con el mismo nombre. MemberId para la identificación de la fila y MemberId para la identificación del amigo.

Editar

Intenta hacerlo así:

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