2011-10-04 145 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之间,因此一到一对一的关系无法确定什么是主体和依赖性,因为两者都是可选的。无论如何,我想你不想要一对一的关系,但实际上有两个一对多的关系(多方(“孩子”)没有在模型中公开)。