¿Cuál es la syntax para auto referenciar claves foráneas en EF Code First?

Estoy tratando de hacer referencia a una clave externa de SpouseId a Id en la tabla de contactos. ¿Cuál es la syntax para hacer esto? Parece que no puedo encontrar un ejemplo. Gracias.

Tengo una clase como esta:

public class Contact { public int Id {get;set;} public string Name {get;set;} public int? SpouseId {get;set;} } 

EDIT1 Por el enlace proporcionado por Joel Cunningham y la respuesta de Morteza, he agregado un código adicional.

ContactMap.cs

 public partial class ContactMap : EntityTypeConfiguration { public ContactMap() { this.ToTable("Contact"); this.HasKey(c => c.Id); this.HasOptional(c => c.Spouse) .WithMany() .IsIndependent() .Map(m => m.MapKey(fk => fk.Id, "SpouseId")); } } 

MyObjectContext.cs

 public class MyObjectContext : DbContext, IDbContext { public DbSet Contacts {get;set;} protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Conventions.Remove(); modelBuilder.Configurations.Add(new ContactMap()); } } 

Nota: También agregué el atributo “[ForeignKey (” SpouseId “)] a mi propiedad de cónyuge en mi clase de contacto. Lamentablemente sigo recibiendo “La secuencia contiene más de un elemento coincidente”.

EDIT2: las respuestas de Morteza a continuación son correctas. En resumen: para autorreferenciar claves foráneas, puede marcar la propiedad como “[ForeginKey (” SpouseId “)] O usar el siguiente ejemplo de API fluida. Los errores que comuniqué en algunos de mis comentarios fueron causados ​​por mi prueba de unidad. generé el DB de la manera correcta. Encontré un buen enlace donde Craig Stuntz describió por qué las claves de autoincremento y las claves foráneas autorreferenciales pueden causar el error “No se puede determinar un pedido válido para las operaciones dependientes.” Creo que este es mi problema es. Espero que esto ayude a alguien.

Algo como esto funcionará:

 public class Contact { public int Id {get;set;} public string Name {get;set;} public int? SpouseId {get;set;} [ForeignKey("SpouseId")] public Contact Spouse {get;set;} } 

ForeignKeyAttribute se ha agregado a System.ComponentModel.DataAnnotations mediante el ensamblado CTP5.

Actualización I: error CTP5:

Debido a un error en CTP5, la creación de una asociación de autoreferenciación independiente arroja una excepción. La solución alternativa es utilizar Asociaciones de claves extranjeras en su lugar (que siempre se recomienda independientemente).

Actualización II: Uso de la API de Fluent para configurar una asociación de autorreferenciación:

También puede usar una API fluida para lograr esto, si lo prefiere:

 public class Contact { public int Id { get; set; } public string Name { get; set; } public int? SpouseId { get; set; } public Contact Spouse { get; set; } } public class Ctp5Context : DbContext { public DbSet Contacts { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity() .HasOptional(c => c.Spouse) .WithMany() .HasForeignKey(c => c.SpouseId); } } 

Trabajando con el modelo:

 using (var context = new Ctp5Context()) { Contact contact = new Contact() { Name = "Morteza", Spouse = new Contact() { Name = "Code-First" } }; context.Contacts.Add(contact); context.SaveChanges(); } 
 [Table("Move")] public class Move { [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public long ID { get; set; } public long? ParentID { get; set; } [InverseProperty("Children")] public virtual Move Parent { get; set; } public virtual ICollection Children { get; set; } } 

Además, la propiedad de navegación Spouse debe ser virtual para evitar consultas innecesarias JOIN:

  public virtual Contact Spouse { get; set; }