53 votes

CodeFirst EF4.1 MVC contre la base de données héritée - Conflits de multiplicité

Peu importe la façon dont je le mélange, cela me donne des erreurs. J'ai l'impression de manquer quelque chose d'évident car je continue à recevoir ces erreurs.

Un ou plusieurs erreurs de validation ont été détectées lors de la génération du modèle :

System.Data.Edm.EdmAssociationType: : La multiplicité entre en conflit avec la contrainte référentielle du rôle 'Venue_Courses_Source' dans la relation 'Venue_Courses'. Comme toutes les propriétés dans le rôle dépendant sont non-nullable, la multiplicité du rôle principal doit être '1'.

System.Data.Edm.EdmAssociationEnd: : La multiplicité n'est pas valide pour le rôle 'Venue_Courses_Target' dans la relation 'Venue_Courses'. Comme le rôle dépendant fait référence aux propriétés clés, la limite supérieure de la multiplicité du rôle dépendant doit être 1.

Un cours ne peut avoir qu'un seul lieu, les lieux peuvent être utilisés par de nombreux cours

public class Course
{
    [Key]
    public virtual int Id { get; set; }
    public string Title { get; set; }
    public DateTime StartDate { get; set; }
    public int VenueId { get; set; }

    public virtual Venue Venue { get; set; }
}

public class Venue
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection Courses { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

    #region Courses
    //Alias de table
    modelBuilder.Entity().ToTable("DBSCHEMA.TR_COURSES");
    //Clés
    modelBuilder.Entity().HasKey(c => c.Id);
    //Joins
    //Jointure avec les lieux
    modelBuilder.Entity().HasOptional(c => c.Venue);

    //Champs
    modelBuilder.Entity().Property(c => c.Id).HasColumnName("COURSE_ID");
    modelBuilder.Entity().Property(c => c.Title).HasColumnName("CR_TITLE");
    modelBuilder.Entity().Property(c => c.StartDate).HasColumnName("START_DATE");
    modelBuilder.Entity().Property(c => c.VenueId).HasColumnName("VENUE_ID");
    #endregion

    #region Venues
    //Alias de table
    modelBuilder.Entity().ToTable("DBSCHEMA.VENUES");
    //Clés
    modelBuilder.Entity().HasKey(v => v.Id);
    //Joins
    modelBuilder.Entity().HasMany(venue => venue.Courses);
    //Champs
    modelBuilder.Entity().Property(v => v.Id).HasColumnName("VENUE_ID");
    modelBuilder.Entity().Property(v => v.Name).HasColumnName("VENUE_NAME");
    #endregion

}

140voto

ClaitonLovatoJr Points 1472

J'espère que cela arrive à temps pour vous aider. J'avais aussi exactement le même problème et j'ai eu du mal avec pendant presque une heure jusqu'à ce que je puisse repérer mon erreur.

Le problème est que la relation Course.Venue est facultative (comme déclaré dans l'API fluide), mais la déclaration de l'Id de Course.VenueId est obligatoire, donc vous pouvez rendre VenueId facultatif en le changeant en

public int? VenueId { get; set;}

ou changer la relation en obligatoire dans l'API fluide, et le OnModelCreating devrait fonctionner correctement une fois que vous aurez effectué ce changement.

4voto

Leblanc Meneses Points 1664

Après avoir recherché sur le web pour

System.Data.Edm.EdmAssociationType: : Multiplicité est en conflit avec la contrainte référentielle dans le rôle

Il est apparu ce post à plusieurs reprises, voici donc mon problème et ma solution:

J'ai mis à jour un gros projet d'ef4.0 à ef4.1 en utilisant l'extension de rétro-ingénierie ef de vs. Notre application mvc utilisait metadatatype et des partials pour décorer les objets ef4.0.

Après avoir supprimé les fichiers du metadatatype, le projet a commencé à fonctionner.

Le problème principal était l'attribut [Requis] car l'objet ef poco avait nullable et mon metadatatype avait [Requis] sur la même propriété. Auparavant, il servait à appliquer les règles de validation mvc et maintenant ef4.1 l'utilisait pour peupler les propriétés de navigation. Enlever [Requis] du metadatatype a résolu le problème.

public partial class AgentAgency
{
    public long OID { get; set; }
    public long? AgentOID { get; set; }
    public long? AgencyOID { get; set; }
    public string ReinsuranceYear { get; set; }
    public virtual Agency Agency { get; set; }
    public virtual Agent Agent { get; set; }
}

public class AgentAgencyMetadata
{
    public Int64 OID { get; set; }

    [Required]
    public Int64 AgentOID { get; set; }

    [Required]
    public Int64 AgencyOID { get; set; }
}

2voto

lomec Points 889

J'ai eu du mal avec cette erreur dans mon projet Entity Framework, j'ai résolu le problème en changeant la valeur nullable de VenueId.

2voto

ancajic Points 705

Assurez-vous de ne pas utiliser HasKey() en combinaison avec HasOptional() dans vos mappings. Cela provoquait cette erreur dans mon cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X