EF 4.1 Code首先是多个一对多关联

时间:2011-10-04 17:17:49

标签: c# entity-framework

这是我的模特

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?然后我又得到了第一个错误。

2 个答案:

答案 0 :(得分:0)

我认为您需要手动设置自引用关系(具体而言,Horse类属性SireDam会导致问题。)

试试这个(在答案中):

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

您可以添加两个代表外键的int ID(SireId,DamId)。

答案 1 :(得分:0)

如果将其添加到模型配置中,它应该可以工作:

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

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

问题是映射约定试图在DamSire之间创建一对一的关系,因此无法确定什么是主体和什么是依赖,因为两者都是可选的。无论如何,我猜你不想要一对一的关系,但实际上是两个一对多的关系(多方(“孩子”)没有在模型中公开)。