2011-11-04 12 views
53

Niezależnie od tego, w jaki sposób je miksuję, daje mi to błędy. Mam przeczucie, że brakuje mi czegoś oczywistego, bo ciągle dostaję te błędy. wykrytoCodeFirst EF4.1 MVC Przeciw starszej bazie danych - Konflikty wielorakie

jeden lub więcej błędów walidacji podczas generacji modelu:

System.Data.Edm.EdmAssociationType:: multipletowość konflikty z ograniczenia referencyjnego w roli „Venue_Courses_Source” w relacji „Venue_Courses”. Ponieważ wszystkie właściwości w roli zależnej nie są zerowalne, wielość roli głównej musi mieć wartość "1".

System.Data.Edm.EdmAssociationEnd:: Wielość nie jest poprawna w roli "Venue_Courses_Target" w związku "Venue_Courses". Ponieważ Dependent Role odnosi się do kluczowych właściwości, górna granica wielości zależnej rola musi być 1.

Kurs może mieć tylko jedno miejsce, lokali może być używany przez wielu kursach

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 

} 

Odpowiedz

139

Mam nadzieję, że to nadal jest na czas, aby ci pomóc. Miałem również ten sam problem i przez prawie godzinę borykałem się z tym problemem, dopóki nie zauważyłem mojego błędu.

Problemem jest to, że Course.Venue związek jest opcjonalny (jak oświadczył na płynną API), ale deklaracja Id Course.VenueId jest obowiązkowe, więc można albo zrobić VenueId opcjonalnie zmieniając go

public int? VenueId { get; set;} 

lub zmiany związek z obowiązkowym w płynnym interfejsie API i OnModelCreating powinien działać dobrze po zmianie tego.

+4

Wielkie dzięki, cieszę się, że nie tylko ja! ;) –

+1

doh! uratowałeś moje zdrowie psychiczne tam :) –

+0

Właśnie uratowałem mi dużo czasu.Dzięki! –

4

Po poszukiwaniach w internecie

System.Data.Edm.EdmAssociationType:: wielość konfliktów z ograniczenia referencyjnego w roli

To zachowało nadchodzi z tego postu więc tutaj był mój problem i rozwiązanie:

Uaktualniłem duży projekt z ef4.0 do ef4.1, używając rozszerzenia odwrotnego inżynierii vs ef. Nasza aplikacja mvc używała metadatatype i partials do dekorowania obiektów ef4.0.

Po usunięciu plików metadatatype projekt zaczął działać.

Głównym problemem był atrybut [Wymagany], ponieważ obiekt ef poco miał zerowalny i mój metadataty miał [Wymagany] dla tej samej właściwości. Poprzednio było wymuszanie reguł sprawdzania poprawności mvc, a teraz używało ef4.1 do zapełniania właściwości nawigacji. Usunięcie [Wymagane] off metadatatype rozwiązało problem.

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

Znalazłem również moją klasę metadanych jako winowajcę! –

2

I już zmagał się z tym błędem w moim projekcie Entity Framework, mam rozwiązać ten problem poprzez zmianę zerowalne wartości VenueId.

2

Upewnij się, że w swoich mapowaniach nie używasz HasKey() w połączeniu z HasOptional(). To spowodowało ten błąd w moim przypadku.