web-dev-qa-db-fra.com

Impossible de déterminer l'extrémité principale d'une association - Modèle de structure d'entité d'abord

J'ai créé Entity Data Model dans Visual Studio. Maintenant, j'ai un fichier avec des requêtes SQL et des classes C # générées à partir de Model.

Question:

Les classes sont générées sans annotations ni code derrière (API Fluent). Est-ce que c'est bon? J'ai essayé d'exécuter mon application mais une exception a été levée:

Impossible de déterminer la fin principale d'une association entre les types 'Runnection.Models.Address' et 'Runnection.Models.User'. L'extrémité principale de cette association doit être explicitement configurée à l'aide de la relation API couramment utilisée ou des annotations de données.

J'ai lu que je ne peux pas utiliser l'API Fluent avec "Model First". Alors qu'est-ce que je peux faire? 

Code:

Utilisateur

public partial class User
{
    public User()
    {
        this.Events = new HashSet<Event>();
        this.CreatedEvents = new HashSet<Event>();
    }

    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Photo { get; set; }
    public int EventId { get; set; }
    public string Nickname { get; set; }
    public OwnerType OwnerType { get; set; }
    public NetworkPlaceType PlaceType { get; set; }

    public virtual ICollection<Event> Events { get; set; }
    public virtual Address Address { get; set; }
    public virtual ICollection<Event> CreatedEvents { get; set; }
    public virtual Owner Owner { get; set; }
}

Adresse

public partial class Address
{
    public int Id { get; set; }
    public string Street { get; set; }
    public string StreetNumber { get; set; }
    public string City { get; set; }
    public string ZipCode { get; set; }
    public string Country { get; set; }

    public virtual User User { get; set; }
}

Le contexte

// Model First n'utilise pas cette méthode

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Address>().HasRequired(address => address.User)
                                   .WithRequiredDependent();
        modelBuilder.Entity<User>().HasRequired(user => user.Address)
                                   .WithRequiredPrincipal();

        base.OnModelCreating(modelBuilder);
    }
13
Michal

Vous devez spécifier le principal dans une relation un à un. 

public partial class Address
{
    [Key, ForeignKey("User")]
    public int Id { get; set; }
    public string Street { get; set; }
    public string StreetNumber { get; set; }
    public string City { get; set; }
    public string ZipCode { get; set; }
    public string Country { get; set; }

    public virtual User User { get; set; }
}

En spécifiant une contrainte FK, EF sait que l'utilisateur doit exister en premier (le principal) et que l'adresse suit.

Lectures supplémentaires sur MSDN.

Voir aussi cette réponse SO.


Mis à jour à partir des commentaires


Dans le concepteur, sélectionnez l’association (ligne entre Utilisateurs et Adresse). Dans la fenêtre des propriétés, cliquez sur le bouton avec la contrainte [...] sur la contrainte référentielle (ou double-cliquez sur la ligne). Définissez le principal en tant qu'utilisateur.


29
Eric W.

Erreur: Même erreur de "Impossible de déterminer la fin principale d'une association entre les types 'Providence.Common.Data.Batch' et 'Providence.Common.Data.Batch'. La fin principale de cette association doit être explicitement configuré à l'aide de la relation API fluide ou des annotations de données. ". 

CEPENDANT, notez qu'il s'agit de la table SAME. 

Cause: Ma base de données était MS SQL Server. Malheureusement, lorsque Management Studio de MS SQL Server ajoute des clés étrangères, il ajoute la clé étrangère par défaut en tant que colonne ID de lot de la table Batch qui renvoie à elle-même. En tant que développeur, vous êtes supposé choisir une autre table et un identifiant de clé réellement étrangère, mais si vous échouez, vous pourrez toujours entrer le FK avec auto-référencement. 

Solution: La solution consistait à supprimer le FK par défaut. 

Cause 2: Une autre situation est que la table actuelle peut être corrigée, mais que l'ancienne image historique de la table lorsque l'edmx de l'EF était terminé comportait le FK par défaut. 

Solution 2: consiste à supprimer la table de la liste Types d'entités du navigateur de modèle, à cliquer sur "oui", puis à nouveau sur "Mettre à jour le modèle à partir de la base de données".

0
Eric Wood