web-dev-qa-db-fra.com

Code First EF 4.1 MVC Against legacy database - Conflits de multiplicité

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

Une 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 dans le rôle 'Venue_Courses_Source' dans la relation 'Venue_Courses'. Étant donné que toutes les propriétés du rôle dépendant ne peuvent pas être annulées, la multiplicité du rôle principal doit être "1".

System.Data.Edm.EdmAssociationEnd:: la multiplicité n'est pas valide dans le rôle 'Venue_Courses_Target' dans la relation 'Venue_Courses'. Étant donné que 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.

n cours ne peut avoir qu'un seul lieu, les lieux peuvent être utilisés par plusieurs 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<Course> Courses { get; set; }
}


protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

    #region Courses
    //Table Alias
    modelBuilder.Entity<Course>().ToTable("DBSCHEMA.TR_COURSES");
    //Keys
    modelBuilder.Entity<Course>().HasKey(c => c.Id);
    //Joins
    //Join to Venues
    modelBuilder.Entity<Course>().HasOptional(c => c.Venue);

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


    #region Venues
    //Table Alias
    modelBuilder.Entity<Venue>().ToTable("DBSCHEMA.VENUES");
    //Keys
    modelBuilder.Entity<Venue>().HasKey(v => v.Id);
    //Joins
    modelBuilder.Entity<Venue>().HasMany(venue => venue.Courses);
    //Fields
    modelBuilder.Entity<Venue>().Property(v => v.Id).HasColumnName("VENUE_ID");
    modelBuilder.Entity<Venue>().Property(v => v.Name).HasColumnName("VENUE_NAME");
    #endregion

}
53
David C

J'espère qu'il est encore temps de vous aider. J'avais aussi exactement le même problème et je m'en occupais pendant près d'une heure jusqu'à ce que je puisse repérer mon erreur.

Le problème est que Course.Venue la relation est facultative (comme déclaré sur l'API courante), mais la déclaration Id de Course.VenueId est obligatoire, vous pouvez donc rendre VenueId facultatif en le remplaçant par

public int? VenueId { get; set;}

ou changez la relation en obligatoire sur l'API courante, et OnModelCreating devrait fonctionner correctement une fois que vous avez changé cela.

140
Claiton Lovato

Après avoir recherché sur le Web

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

Il n'arrêtait pas de venir avec ce message alors voici mon problème et ma solution:

J'ai mis à niveau un grand projet d'ef4.0 vers ef4.1 en utilisant l'extension d'ingénierie inverse vs ef. Notre application mvc utilisait des métadonnées et des partiels pour décorer des objets ef4.0.

Après avoir supprimé les fichiers du type de métadonnées, le projet a commencé à fonctionner.

Le problème racine était l'attribut [Obligatoire] car l'objet ef poco avait la valeur Null et mon métadatatype avait [Obligatoire] sur la même propriété. Auparavant, il fallait appliquer les règles de validation mvc et maintenant ef4.1 était utilisé pour remplir les propriétés de navigation. La suppression de [Obligatoire] du type de métadonnées 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; }
}
4
Leblanc Meneses

Assurez-vous de ne pas utiliser HasKey () en combinaison avec HasOptional () dans vos mappages. C'était à l'origine de cette erreur dans mon cas.

2
ancajic

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

2
lomec