Impossible de Déterminer les Principaux de Fin d'Entity Framework Code First Relation

VEUILLEZ VÉRIFIER LA SOLUTION LA SECTION CI-DESSOUS

J'ai un problème avec une relation de clé étrangère - voici mes tables:

public class Lead
{
    [Key]
    public int LeadId { get; set; }
    public int? CustomerId { get; set; }

    [ForeignKey("CustomerId")]
    public virtual Customer Customer { get; set; }
 }

public class Customer
{
    [Key]
    [Column("customer_id")]
    public int CustomerId { get; set; }

    [ForeignKey("CustomerId")]
    public virtual Lead Lead { get; set; }

}

Je rencontre un problème lorsque je reçois cette erreur:

Unable to determine the principal end of an association between the types 'Sales.Customers.Customer' and 'Sales.Leads.Lead'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.

J'ai essayé d'ajouter la relation à l'modelbuilder, mais il semble que sa ne fonctionne pas correctement. Quand je reçois le message d'erreur d'aller loin ses fait à l'aide de la Lead.LeadId -> Customer.CustomerId que la relation au lieu de Lead.CustomerId -> Customer.CustomerId relation.

J'ai vérifié sur des questions similaires sur Stackoverflow mais ils ne semblent pas correspondre à mon DB structure et lorsque j'essaie de mettre en œuvre leurs suggestions de la relation ne fonctionne toujours pas correctement.

Sa vraiment bizarre - vous serions reconnaissants de l'aide sur ce!

Mise à JOUR

Donc dans ma tentative pour obtenir cette relation au travail, j'ai activé les touches autour de la manière suivante:

public class Lead
{
    [Key]
    public int LeadId { get; set; }

    [ForeignKey("LeadId")]
    public virtual Customer Customer { get; set; }
}

public class Customer
{
    [Key]
    [Column("customer_id")]
    public int CustomerId { get; set; }
    public int? LeadId { get; set; }

    [ForeignKey("LeadId")]
    public virtual Lead Lead { get; set; }
}

Toutefois, la même erreur, encore pas de chance - je suis vraiment à une perte pourquoi cette relation ne fonctionne pas. Pour moi, il semble assez simple.

Mise à JOUR 2

Ok - après une TONNE de temps perdu gâcher, avec ce que j'ai essayé une approche légèrement différente:

Voici mes nouvelles classes....

    public class Lead
    {
        [Key, ForeignKey("Customer")]
        public int LeadId { get; set; }
        public virtual Customer Customer { get; set; }
    }

    public class Customer
    {
        [Key]
        [Column("customer_id")]
        public int CustomerId { get; set; }
        public int? LeadId { get; set; }
        public virtual Lead Lead { get; set; }
     }

Pas plus les messages d'erreur avec le code ci-dessus! Le seul problème, c'est que la relation entity framework est en cours de création est entre le Client.Code client et le Plomb.LeadId à la place du Client.LeadId et le Plomb.LeadId - j'ai l'impression que je suis SI PROCHE!!!!

SOLUTION POSSIBLE

Ok - donc après quelques recherches je suis tombé sur ce post ici:
EF Premier Code - 1-de-1 en Option Relation

J'ai modifié mes classes:

public class Customer
{
    [Key]
    [Column("customer_id")]
    public int CustomerId { get; set; }

    public virtual Lead Lead { get; set; }
}

public class Lead
{
    [Key]
    public int LeadId { get; set; }
    public virtual Customer Customer { get; set; }
 }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Customer>().HasOptional<Lead>(l => l.Lead).WithOptionalDependent(c => c.Customer).Map(p => p.MapKey("LeadId"));
    base.OnModelCreating(modelBuilder);
}

Tout fonctionne très bien! Mais un GROS problème...

J'ai dû enlever le LeadId propriété de la Table des Clients.... alors maintenant, je ne suis pas sûr de savoir comment je peux attribuer un LeadId lors de la création d'un nouveau Client (le cas échéant) si il n'y a pas de LeadId des biens à céder?

Juste pour être sûr avant de me creuser plus profond, avez-vous l'intention que ce soit un one-to-one relation entre le Client et le Plomb?
Eh bien... oui - c'est exact - cependant, il n'y a pas de Plomb nécessaire pour un Client, un client peut être entrés dans le système sans être un chef de premier sais ce que je veux dire? aussi, il peut être une voie sans un client, comme un chef de file qui n'est pas le convertir en client
Je gotcha. Voulais juste assurez-vous que vous n'allez pas pour un un-à-plusieurs. Parce que c'est une bête différente. Lemme de regarder...
C'est assez simple en utilisant des API fluent.
oui je l'ai ajouté à la réponse dans le cas où vous souhaitez l'utiliser, je préfère API fluent pour les annotations, juste dire ce parce que je n'ai aucune idée de comment cela pourrait être réalisé à l'aide d'annotations.

OriginalL'auteur 99823 | 2013-07-15