2011-10-04 146 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的關係。 一旦它說它有一個不可空字段。

我做了可空的int?然後我再次得到第一個錯誤。

+1

如果你需要[使用'virtual'](http://msdn.microsoft.com/zh-cn/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標識。

+1

你先生很棒。 說說不看大圖。我只是集中在這些名單上。 現在解決我的數據庫找不到錯誤;) 謝謝一堆。 – Puzzle84

0

如果您添加到您的車型配置它應該工作:

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

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

的問題是,映射約定嘗試創建DamSire之間,因此一到一對一的關係無法確定什麼是主體和依賴性,因爲兩者都是可選的。無論如何,我想你不想要一對一的關係,但實際上有兩個一對多的關係(多方(「孩子」)沒有在模型中公開)。