我在使用两个外键引用同一张表时遇到了问题。虽然外键id字段已被填充,但导航字段和列表(Team字段)却为空。
我的类如下:
public class Team
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Fixture> HomeFixtures { get; set; }
public virtual ICollection<Fixture> AwayFixtures { get; set; }
}
public class Fixture
{
public int Id { get; set; }
public int HomeTeamId { get; set; }
public int AwayTeamId { get; set; }
public Team HomeTeam { get; set; }
public Team AwayTeam { get; set; }
}
和我的dbContext
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public DbSet<Team> Teams { get; set; }
public DbSet<Fixture> Fixtures { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Fixture>()
.HasOne(f => f.HomeTeam)
.WithMany(t => t.HomeFixtures)
.HasForeignKey(t => t.HomeTeamId)
.OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict);
modelBuilder.Entity<Fixture>()
.HasOne(f => f.AwayTeam)
.WithMany(t => t.AwayFixtures)
.HasForeignKey(t => t.AwayTeamId)
.OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict);
}
}
我尝试为HomeTeam和AwayTeam属性添加[ForeignKey()]
属性,但没有效果。
我还尝试将OnModelCreating方法改为另一种方式,即:
modelBuilder.Entity<Team>()
.HasMany(t => t.HomeFixtures)
.WithOne(f => f.HomeTeam)
.HasForeignKey(f => f.HomeTeamId)
.OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict);
对于客场比赛,情况也是一样的,但这会产生相同的行为。
无论我如何查询,似乎都没有关系,但最简单的情况是
Fixture fixture = await _context.Fixtures.SingleOrDefaultAsync(f => f.Id == id);
返回的fixture对象包含在数据库中有效且存在的团队ID,但是Team对象仍未填充。
有人知道我做错了什么吗? 这是一个全新的项目和全新的数据库,所以没有旧代码干扰。 我正在使用Visual Studio 2017rc与Entity Framework Core。