2011-10-04 4 views
1

는 여기에이 오류가 계속 내 모델EF 4.1 코드 첫 번째 여러 일대 협회

public class Horse 
{ 
    public int HorseId { get; set; } 
    public string Name { get; set; } 
    public string Gender { get; set; } 
    public LegType LegType { get; set; } 
    public Character Character { get; set; } 
    public int Hearts { get; set; } 
    public bool Retired { get; set; } 
    // Parents 
    public Horse Sire { get; set; } 
    public Horse Dam { get; set; } 
    // Internals 
    public int Stamina { get; set; } 
    public int Speed { get; set; } 
    public int Sharp { get; set; } 
    // Special 
    public int Dirt { get; set; } 
    // Externals 
    public int Start { get; set; } 
    public int Corner { get; set; } 
    public int OutOfTheBox { get; set; } 
    public int Competing { get; set; } 
    public int Tenacious { get; set; } 
    public int Spurt { get; set; } 
    //Races 
    public virtual ICollection<Race> RaceResults { get; set; } 
    //Training 
    public virtual ICollection<Training> TrainingResults { get; set; } 
} 

public class Race 
{ 
    public int RaceId { get; set; } 
    public int Favorite { get; set; } 
    public LegType LegType { get; set; } 
    public int Players { get; set; } 
    public DateTime Split { get; set; } 
    public DateTime Final { get; set; } 
    public int Position { get; set; } 

    public virtual int TrackId { get; set; } 
    public virtual Track Track { get; set; } 

    public virtual int LinkedHorseId { get; set; } 
    public virtual Horse LinkedHorse { get;set; } 
} 

public class Training 
{ 
    public int TrainingId { get; set; } 
    public string Type { get; set; } 
    public string Result { get; set; } 
    public string Food { get; set; } 
    public int Start { get; set; } 
    public int Corner { get; set; } 
    public int Outofthebox { get; set; } 
    public int Competing { get; set; } 
    public int Tenacious { get; set; } 
    public int Spurt { get; set; } 

    public virtual int LinkedHorseId { get; set; } 
    public virtual Horse LinkedHorse { get; set; } 
} 

public class Track 
{ 
    public int TrackId { get; set; } 
    public string Name { get; set; } 
    public int Distance { get; set; } 
    public bool G1 { get; set; } 
    public int Prize { get; set; } 
} 

And here is my fluent API code. 

public class HorseTracker : DbContext 
{ 
    public DbSet<Horse> Horses { get; set; } 
    public DbSet<LegType> LegTypes { get; set; } 
    public DbSet<Character> Characters { get; set; } 
    public DbSet<Training> TrainingResults { get; set; } 
    public DbSet<Track> Tracks { get; set; } 
    public DbSet<Race> Races { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Race>() 
      .HasRequired(r => r.LinkedHorse) 
      .WithMany(h => h.RaceResults) 
      .HasForeignKey(r => r.LinkedHorseId); 

     modelBuilder.Entity<Training>() 
      .HasRequired(t => t.LinkedHorse) 
      .WithMany(t => t.TrainingResults) 
      .HasForeignKey(t => t.LinkedHorseId); 

     modelBuilder.Entity<Race>() 
      .HasRequired(r => r.Track) 
      .WithMany() 
      .HasForeignKey(r => r.TrackId) 
      .WillCascadeOnDelete(false); 
    } 
} 

입니다 : 유형 'DOCCL.Models.Horse 사이의 관계의 주요 끝을 확인할 수 없습니다 '및'DOCCL.Models.Horse '. 이 연결의 주요 끝은 유창한 API 또는 데이터 주석의 관계를 사용하여 명시 적으로 구성되어야합니다.

내가 무엇을 잘못하고 있는지 실마리가 있습니다. 외래 키가없는 채 놀았습니다. 필수 목록 중 하나를 선택적으로 만듭니다. 모두 오류가 발생합니다. 은 주로 관계가 1 : 1 관계 여야한다고 말합니다. 그리고 일단 null이 아닌 필드가 있다고 말했습니다.

nullable int를 만들었습니까? 그리고 나서 첫 번째 오류가 다시 발생했습니다.

+1

부모 말을 게으른로드하려면 [virtual'] (http://msdn.microsoft.com/en-us/library/gg715120%28v=vs.103%29.aspx)를 사용하십시오. 온 가족이 번식 할 것입니다. –

답변

0

수동으로 자기 참조 관계를 설정해야한다고 생각합니다. 구체적으로는 Horse 클래스 속성 SireDam이 문제의 원인입니다.

는 (이 질문에)이 시도 :

What is the syntax for self referencing foreign keys in EF Code First?

당신은 외래 키 (SireId, DamId)를 나타내는 두 개 더 int ID를 추가 할 수 있습니다. 당신이 당신의 모델 구성에 이것을 추가하면

+1

당신은 훌륭합니다. 더 큰 그림을 보지 말라. 나는 그 목록에 초점을 맞추기 만했다. 이제 데이터베이스를 찾을 수 없습니다. 오류 : 감사합니다. – Puzzle84

0

그것을 작동합니다 :

modelBuilder.Entity<Horse>() 
      .HasRequired(h => h.Dam) // or HasOptional 
      .WithMany(); 

modelBuilder.Entity<Horse>() 
      .HasRequired(h => h.Sire) // or HasOptional 
      .WithMany(); 

을 문제는 매핑 규칙이 무엇 확인할 수 없습니다 때문에 DamSire 사이의 일대일 관계를 만들려고 할 것입니다 교장 선생님과 부인은 둘 다 선택 사항이기 때문에 무엇이 종속적입니까? 어쨌든 당신은 일대일 관계가 아니라 두 개의 일대 다 관계 (모델에 노출되지 않은 많은 측면 ("자식"))를 원한다고 생각합니다.

관련 문제