这是我在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,但博客条目似乎都暗示这是必要的。
有人可以帮我解决这个问题吗?
感谢。
答案 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; }
}
有任何问题请告诉我。