【问题标题】:I want to use a table ID to a different table that takes two of that tables ID, Entity Framework, code first我想将表 ID 用于另一个表,该表需要两个表 ID、实体框架、代码优先
【发布时间】:2018-08-27 02:44:01
【问题描述】:

这只是我快速完成的事情,但它显示了我想要的样子。 OBS 数据库图表表图片。所以我希望Team 表与Transfer 表有两个关系(OldTeamIdNewTeamId),这可能吗?

当我尝试按照现在的样子执行Add-Migration 时,我收到一条消息

无法确定“List”类型的导航属性“Team.OldTeams”表示的关系。手动配置关系,或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略此属性

代码:

public class Transfer
{
    public int Id { get; set; }
    public DateTime TransferDate { get; set; }
    public Player ThePlayer { get; set; }
    public string PlayerId { get; set; }
    public Team OldTeam { get; set; }
    public int OldTeamId { get; set; }
    public Team NewTeam { get; set; }
    public int NewTeamId { get; set; }
}

public class Team
{
    public Team()
    {
        Tournaments = new List<Tournament>();
        Players = new List<TeamPlayer>();
        OldTeams = new List<Transfer>();
        NewTeams = new List<Transfer>();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public byte[] TeamLogo { get; set; }
    public DateTime Founded { get; set; }
    public Country TheCountry { get; set; }
    public int CountryId { get; set; }
    public List<Tournament> Tournaments { get; set; }
    public List<TeamPlayer> Players { get; set; }
    public List<Transfer> OldTeams { get; set; }
    public List<Transfer> NewTeams { get; set; }
}

public class GamepediaContext : DbContext
{
    public DbSet<Country> Countries { get; set; }
    public DbSet<Map> Maps { get; set; }
    public DbSet<Player> Players { get; set; }
    public DbSet<Team> Teams { get; set; }
    public DbSet<TeamPlayer> TeamPlayers { get; set; }
    public DbSet<Tournament> Tournaments { get; set; }
    public DbSet<TournamentMap> TournamentMaps { get; set; }
    public DbSet<Transfer> Transfers { get; set; }
}



[1]: https://i.stack.imgur.com/Y8Set.png

【问题讨论】:

  • 你在数据库中创建了两个外键吗?

标签: c# sql entity-framework database-migration code-first


【解决方案1】:

使用foreignKey属性

public class Transfer
{
    public int Id { get; set; }
    public DateTime TransferDate { get; set; }
    public Player ThePlayer { get; set; }
    public string PlayerId { get; set; }   
    public Team OldTeam { get; set; }
    [ForeignKey("OldTeam")]
    public int OldTeamId { get; set; }
    public Team NewTeam { get; set; }
    [ForeignKey("NewTeam")]
    public int NewTeamId { get; set; }
}

【讨论】:

  • 感谢彼得的回答,我尝试了这个,但是当我尝试执行突击队 Add-Migration = Unable to determine the relationship of navigation property 'Team.OldTeams' 时,我仍然收到失败消息。键入“列表”。手动配置关系,或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略此属性。
  • 当您在两个实体之间有多个关系时,您不必为每个导航属性指定外键所以。在 Team 类中,在每个 List&lt;Transfer&gt; 类型的两个导航属性上添加外键属性,并使用将映射到这样的列名称 [ForeignKey("OldTeamId")] public List&lt;Transfer&gt; OldTeams { get; set; } [ForeignKey("OldTeamId")] public List&lt;Transfer&gt; NewTeams { get; set; } @byteArrayJake
  • 啊,好吧,我让它工作了,所以感谢彼得的帮助!
【解决方案2】:

我让它工作,我添加了这行代码。我将脚本“onDelete”从 Cascade 更改为 NoAction。

modelBuilder.Entity<Team>().HasMany(m => m.OldTeams).WithOne(m => m.OldTeam).HasForeignKey(m => m.OldTeamId);
        modelBuilder.Entity<Team>().HasMany(m => m.NewTeams).WithOne(m => m.NewTeam).HasForeignKey(m => m.NewTeamId);

【讨论】:

    猜你喜欢
    • 2016-10-11
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 2017-07-05
    相关资源
    最近更新 更多