使用EF Code First开发的SQL CE db中的多对一ForeignKeys

时间:2011-06-18 20:55:56

标签: foreign-keys sql-server-ce entity-framework-4.1 ef-code-first

这是我在SQL CE或EF中的第一次尝试,所以我可能会有很多误解。我搜索过很多博客文章,但似乎仍然无法做到这一点。

我有一个MVC3网站,用于注册我们正在运行的比赛。我有一个RaceEvents表和一个Runners表,其中每个RaceEvent将有许多运行者为它注册它,即多对一。以下是剥离了无关数据的POCO:

  public class RaceEvent
{
    [Required]
    public int Id { get; set; }

    public virtual ICollection<Runner> Runners { get; set; }

}

    public class Runner
{
    [Required]
    public int Id { get; set; }
    [Required]
    public int RaceEventId { get; set;}
    [ForeignKey("RaceEventId")]
    public RaceEvent RaceEvent { get; set; }
}

尽管我能弄明白,但应该这样做。据我了解,它应该按照惯例弄清楚RaceEventId是RaceEvents的外键。如果这还不够好,我会用ForeignKey属性告诉它。

然而,它似乎没有起作用。每当我插入一个新的跑步者时,它也会在RaceEvents表中插入一个新的条目。当我查看ServerExplorer中的表格图时,它会在Runners表格图的顶部显示两个金钥匙,一个用于Id,在属性中标识为PrimaryKey,另一个用于RaceEventId,未标识为PrimaryKey,但是在属性中表示要用于表Runners,而不是表RaceEvents。我期待Id的金钥匙,但RaceEventId的银色外键。

FWIW,我并不关心RaceEvent中的ICollection,但博客条目似乎都暗示这是必要的。

有人可以帮我解决这个问题吗?

感谢。

2 个答案:

答案 0 :(得分:0)

您需要覆盖在DbContext中创建的模型。以下是AnsNet_User&amp;的示例。 AspNet_Roles N:N关系

protected override void OnModelCreating(DbModelBuilder dbModelBuilder)
{
    dbModelBuilder.Entity<aspnet_Users>().HasMany(a => a.aspnet_Roles).WithMany(b => 
    b.aspnet_Users).Map( 
        m =>
        {
            m.MapLeftKey("UserId");
            m.MapRightKey("RoleId");
            m.ToTable("aspnet_UsersInRoles");
        });

    base.OnModelCreating(dbModelBuilder);
}

答案 1 :(得分:0)

确定,

抱歉,我没有详细阅读你的问题。在我们的项目中,这就是我们如何表达您的行为。我查看了SSMS并且没有显示所述灰键,但每次添加跑步者时都不会创建比赛事件。虽然您确实需要确保在创建跑步者时设置了比赛事件属性。

public class DB : DbContext
{
    public DB()
        : base("Data Source=(local);Initial Catalog=DB;Integrated Security=True")
    {
    }

    public IDbSet<Runner> Runners { get; set; }
    public IDbSet<RaceEvent> RaceEvents { get; set; }
}

public class RaceEvent
{
    [Key]
    public int RaceEventID { get; set; }


}

public class Runner
{
    [Key]
    public int RunnerID { get; set; }

    [Required]
    public virtual RaceEvent RaceEvent { get; set; }

}

有任何问题请告诉我。