2

Je suis en train de changer l'arrière-plan d'une application existante à utiliser le code Entity Framework Première. J'ai utilisé l'outil intégré dans Visual Studio 2015 pour générer des classes POCO basées sur ma base de données existante. Cela a fonctionné parfaitement pour la plupart, à l'exception de deux classes, avec une relation un-à-zéro ou un. Ce sont mes cours (simplifié):Entity Framework one-to-zéro ou une association clé étrangère

public class Login 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public int TeamMemberId { get; set; } 
    public virtual TeamMember TeamMember { get; set; } 
} 

public class TeamMember 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public virtual Login Login { get; set; } 
} 

Avec la configuration suivante:

public class LoginTypeConfiguration : EntityTypeConfiguration<Login> 
{ 
    public LoginTypeConfiguration() 
    { 
     this.HasRequired(e => e.TeamMember) 
      .WithOptional(e => e.Login); 

     this.Property(e => e.TeamMemberId) 
      .HasColumnName("TeamMember_Id"); 
    } 
} 

Il en résulte la migration suivante:

CreateTable(
    "dbo.Logins", 
    c => new 
     { 
      Id = c.Int(nullable: false, identity: true), 
      TeamMember_Id = c.Int(nullable: false), 
     }) 
    .PrimaryKey(t => t.Id) 
    .ForeignKey("dbo.TeamMembers", t => t.Id) 
    .Index(t => t.Id); 

Pour une raison EF crée une clé étrangère sur [Logins].[Id] au lieu de [Logins].[TeamMember_Id]. Je l'ai déjà essayé décorer ma propriété de navigation avec un attribut ForeignKey, mais cela n'a pas fonctionné. Est-il possible de l'obtenir pour créer une clé étrangère sur la place [Logins].[TeamMember_Id]?

+0

OMG. J'ai ce problème exact. Avez-vous eu de la chance de le découvrir? –

Répondre

0

J'ai fini par créer un à plusieurs, avec une propriété [NotMapped] pour la connexion.

Mes classes:

public class Login 
{ 
    public int TeamMemberId { get; set; } 
    public virtual TeamMember TeamMember { get; set; } 
} 

public class TeamMember 
{ 
    [NotMapped] 
    public virtual Login Login 
    { 
     get { return Logins.FirstOrDefault(); } 
    } 

    public virtual ICollection<Login> Logins { get; set; } 
} 

Avec la configuration suivante:

public class LoginTypeConfiguration : EntityTypeConfiguration<Login> 
{ 
    public LoginTypeConfiguration() 
    { 
     this.Property(e => e.TeamMemberId) 
      .HasColumnName("TeamMember_Id"); 
    } 
} 
0

Pour que vous pouvez écrire votre premier code comme celui-ci. Entity Framework générera automatiquement la clé étrangère TeamMemberId pour vous. Pour plus d'informations: Entity Framework Tutorial - Code First Conventions

public class Login 
{ 
    public int Id { get; set; } //foreign key declaration 
    public int TeamMemberId { get; set; } 
    public TeamMember TeamMember { get; set; } 
} 

public class TeamMember 
{ 
    public int TeamMemberId { get; set; } 
    public Ilist<Login> Login { get; set; } 
} 
+1

Je suis conscient que Entity Framework génère la propriété 'TeamMember_Id' automatiquement. Mais j'ai besoin qu'il soit explicitement défini, puisque le code fait référence à cette propriété. En outre, il devrait s'agir d'une relation de un à zéro ou d'un seul, et non d'un un à plusieurs, comme le suggère votre code. –