2011-11-04 9 views
53

Indipendentemente dal modo in cui lo mescolo, mi dà errori. Ho la sensazione che mi manchi qualcosa di ovvio mentre continuo a ricevere questi errori. sono stati rilevatiCodeFirst EF4.1 MVC Contro database legacy - conflitti di molteplicità

uno o più errori di convalida durante la generazione del modello:

System.Data.Edm.EdmAssociationType:: conflitti Multiplicity con il vincolo referenziale in ruolo 'Venue_Courses_Source' in relazione 'Venue_Courses. Poiché tutte le proprietà nel ruolo dipendente non sono annullabili, la molteplicità del ruolo principale deve essere "1".

System.Data.Edm.EdmAssociationEnd:: La molteplicità non è valida nel ruolo "Venue_Courses_Target" nella relazione "Venue_Courses". Poiché il ruolo Dependent riferisce alle proprietà chiave, il limite superiore della molteplicità del Ruolo dipendente dev'essere 1.

Un corso può avere una sola sede, sedi possono essere utilizzati da molti campi

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 

} 

risposta

139

Spero che questo sia ancora in tempo per aiutarti. Avevo anche lo stesso identico problema e lo stavo preoccupando per quasi un'ora finché non sono riuscito a individuare il mio errore.

Il problema è che Course.Venue rapporto è opzionale (come dichiarato sulle API fluente), ma la dichiarazione Id Course.VenueId è obbligatoria, quindi è possibile fare VenueId opzionale cambiando a

public int? VenueId { get; set;} 

o il cambiamento la relazione obbligatoria per l'API fluente e OnModelCreating dovrebbe funzionare correttamente dopo averlo modificato.

+4

Grazie mille, sono contento di non essere stato l'unico! ;) –

+1

doh! mi hai salvato la sanità mentale :) –

+0

Mi hai appena salvato un sacco di tempo.Grazie! –

4

Dopo la ricerca sul Web per

System.Data.Edm.EdmAssociationType:: conflitti Multiplicity con il vincolo referenziale nel ruolo

Ha mantenuto ritornassi con questo post ecco era il mio problema e la soluzione:

Ho aggiornato un grande progetto da ef4.0 a ef4.1 utilizzando l'estensione di reverse engineering vs ef. La nostra app mvc utilizzava metadatype e partial per decorare oggetti ef4.0.

Dopo aver rimosso i file del metadatype, il progetto ha iniziato a funzionare.

Il problema di root era attributo [obbligatorio] poiché l'oggetto ef poco aveva nullable e il mio metadatatype aveva [richiesto] nella stessa proprietà. Precedentemente doveva applicare le regole di convalida del mvc e ora utilizzava ef4.1 per popolare le proprietà di navigazione. La rimozione di [Required] off metadatatype ha risolto il problema.

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; } 
} 
+0

Ho anche trovato la mia classe di metadati come colpevole! –

2

'ho lottato con questo errore nel mio progetto Entity Framework, ho risolto il problema modificando il valore nullable di VenueId.

2

Assicurarsi di non utilizzare HasKey() in combinazione con HasOptional() nei mapping. Quello stava causando questo errore nel mio caso.

Problemi correlati