2012-04-20 102 views
2

我看着this SO问题。实体框架5(预发布)关于实体关系的新手问题等

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

此外,有人可以解释这是什么呢/是指:

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. 当我需要明确地使用公会创建关系

任何解释表示赞赏。

回答

1

好吧,所以......我无法回答EF测试版中的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的导航对象和一个名为Id的名为Project的实体,它会自动将ProjectId从第一个实体映射到Project实体的Id,并将Project实体作为导航项目当您通过EF从数据库获取数据时的第一个实体:

  3. 仅当您需要基于非约定的关系时。也就是说,例如,您的主键沿着“tblId”或“ParentId”的行而不是“Id”和“ProjectId”。或者您需要针对某些项目采取不同的行为,例如仅为选择实体级联删除。

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); 

    } 

或类似的东西。