2

我看了这个SO问题。

我想在 EF 5 中做类似的事情。我没有看到 ForeignKey 属性,而是 EF5 中的 Association 属性。

另外,有人可以解释这是什么/意味着什么:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Match>()
                .HasRequired(m => m.HomeTeam)
                .WithMany(t => t.HomeMatches)
                .HasForeignKey(m => m.HomeTeamId)
                .WillCascadeOnDelete(false);

    modelBuilder.Entity<Match>()
                .HasRequired(m => m.GuestTeam)
                .WithMany(t => t.AwayMatches)
                .HasForeignKey(m => m.GuestTeamId)
                .WillCascadeOnDelete(false);
}

这是解释:

主键按默认约定映射。球队必须有两个比赛集合。您不能有两个 FK 引用的单个集合。匹配在没有级联删除的情况下进行映射,因为它在这些自引用多对多中不起作用。

我想做的与链接中的示例非常相似,但我不知道:

  1. 当我需要修改 DbContext
  2. 主键何时相互链接
  3. 当我需要显式使用关联来创建关系时

任何解释表示赞赏。

4

2 回答 2

1

好的...我无法回答有关 EF beta 的 ForeignKey 属性问题,因为我还没有机会检查它。

然而...

modelBuilder.Entity<Match>() - Take the entity "Match" and perform following operations on it
.HasRequired(m => m.HomeTeam) - The entity needs to have a non-null navigation HomeTeam...
.WithMany(t => t.HomeMatches) - ... which has a subset of Matches by navigation HomeMatches
.HasForeignKey(m => m.HomeTeamId) ... and the associating foreign key is HomeTeamId on Match
.WillCascadeOnDelete(false); ... and don't cascade when the entity is deleted.

这就是 LINQ 的美妙之处,它通常是自记录的。

现在,至于你的三个问题...

  1. 仅在更改模型关系或添加/删除实体时修改 DbContext。如果要添加,则需要执行 public DbSet Entities { get; 放; 如果删除等,请删除它。

  2. 主键不相互链接。外键链接到主键。按照惯例,如果您有一个 ProjectId、一个名为 Project 的导航对象和另一个名为 Project 且具有名为 Id 的属性的实体,它会自动将 ProjectId 从第一个实体映射到 Project 实体的 Id,并将 Project 实体作为导航项提供给通过 EF 从数据库中获取数据时的第一个实体:

  3. 仅当您需要基于非常规的关系时。即,例如,您的主键是“tblId”或“ParentId”而不是“Id”和“ProjectId”。或者您需要对某些项目采取不同类型的行为,例如仅对选定实体进行级联删除。

于 2012-06-09T19:58:19.553 回答
1

在 EF 5 中,如果您使用迁移,则可以更改迁移代码以不实现级联删除:

CreateTable(
            "dbo.Match",
            c => new
                {
                    MatchId = c.Long(nullable: false, identity: true),
                    Description = c.String(),
                    HomeTeamId = c.Long(nullable: false),
                 })
            .PrimaryKey(t => t.MatchId)
            .ForeignKey("dbo.Team", t => t.HomeTeamId, cascadeDelete: false)                
            .Index(t => t.MatchId)
            .Index(t => t.HomeTeamId);

    }

或类似的东西。

于 2012-07-25T06:11:40.487 回答