关于实体关系等的实体框架5(预发布)新手问题

时间:2012-04-20 12:41:35

标签: linq entity-framework-5

我看了this问题。

我想在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. 当我需要明确使用Association来创建关系时
  4. 感谢任何解释。

2 个答案:

答案 0 :(得分: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”。或者您在某些项目上需要不同类型的行为,例如仅删除选择实体时的级联。

答案 1 :(得分: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);

    }

或类似的东西。