我看了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。匹配是在没有级联删除的情况下映射的,因为它没有 在这些自我引用多对多的工作。
我想要做的与链接中的示例非常相似,但我不知道:
感谢任何解释。
答案 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的美丽,它往往不是自我记录。
现在,至于你的三个问题......
仅在更改模型关系或添加/删除实体时修改DbContext。如果你要添加,你需要做一个 public DbSet Entities {get;组; 如果删除等,请将其删除
主键不会相互链接。外键链接到主键。按照惯例,如果您有一个ProjectId,一个名为Project的导航对象和另一个名为Project的实体,其属性名为Id,它将自动将ProjectId从第一个实体映射到Project实体的Id,并将Project实体作为导航项提供给通过EF从数据库获取数据时的第一个实体:
仅当您需要基于非约定的关系时。即,您的主键是“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);
}
或类似的东西。