0

4.3.1 でのコード ファーストの EF ファンタジー スポーツ ツールの簡単なスキーマを次に示します。

スキーマ

これは、ひねりを加えた古典的な多対多の関係です。Player テーブルには PlayerId+LeagueId の複合キーがあるため、ジャンクション テーブルに引き継がれます。(注: PlayerId はテーブル内で一意ではありません。特定のリーグ (NFL など) が別のリーグ (NBA など) と同じ playerId を使用する場合があります。

このようにマッピングを定義しようとすると、EF エラーが発生します。

this.HasMany(t => t.Players).WithMany(p => p.FantasyTeams).Map(mc => {
            mc.ToTable("FantasyTeam_2_Player");
            mc.MapLeftKey("PlayerId", "LeagueId");
            mc.MapRightKey("FantasyTeamId");
        });

このように、不可解なエラーが発生します:無効な列名 'League_LeagueId'。

右と左を切り替えると、次のようになります。指定された関連付けの外部キー列 'PlayerId' が無効です。指定する列数は、主キー列の数と一致する必要があります。

編集:ここにエンティティがあります

ファンタジーチーム

    public int FantasyTeamId { get; set; }
    public string TeamName { get; set; }
    public string TeamEmail { get; set; }
    public DateTime CreatedDate { get; set; }
    public DateTime LastModified { get; set; }
    public bool Active { get; set; }

    public virtual ICollection<Player> Players { get; set; }

プレーヤー

    public virtual League League { get; set; }
    public int PlayerId { get; set; }
    public int LeagueId { get; set; }
    public string PlayerType { get; set; }
    public string Name { get; set; }
    public string Team { get; set; }
    public string Position { get; set; }

    public virtual ICollection<FantasyTeam> FantasyTeams { get; set; }

マッピング

public Player_Mapping() {
        this.HasKey(t => new { t.PlayerId, t.LeagueId });
        this.ToTable("Player");
        this.Property(t => t.PlayerId).HasColumnName("PlayerId").IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
        this.Property(t => t.LeagueId).HasColumnName("LeagueId").IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
        this.Property(t => t.PlayerType).HasColumnName("PlayerType").HasMaxLength(50).IsRequired();
        this.Property(t => t.Name).HasColumnName("Name").HasMaxLength(255);
        this.Property(t => t.Team).HasColumnName("Team").HasMaxLength(50);
        this.Property(t => t.Position).HasColumnName("Position").HasMaxLength(50);

    }


public FantasyTeam_Mapping() {
        this.HasKey(t => t.FantasyTeamId);
        this.ToTable("FantasyTeam");
        this.Property(t => t.FantasyTeamId).HasColumnName("FantasyTeamId").IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        this.Property(t => t.Active).HasColumnName("Active").IsRequired();
        this.Property(t => t.CreatedDate).HasColumnName("CreatedDate").IsRequired();
        this.Property(t => t.LastModified).HasColumnName("LastModified").IsRequired();
        this.Property(t => t.TeamEmail).HasColumnName("TeamEmail").IsRequired();
        this.Property(t => t.TeamName).HasColumnName("TeamName").IsRequired();
        this.HasMany(t => t.Players).WithMany(p => p.FantasyTeams).Map(mc => {
            mc.ToTable("FantasyTeam_2_Player");
            mc.MapLeftKey("PlayerId", "LeagueId");
            mc.MapRightKey("FantasyTeamId");
        });

    }

ここで何が間違っていますか?

4

1 に答える 1

0

さて、私はこれを(簡略化して)テストしましたが、エラーは発生しません。

public class MyContext: DbContext
    {       
        public DbSet<League> Leagues { get; set; }
        public DbSet<Player> Players { get; set; }
        public DbSet<FantasyTeam> FantasyTeams { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<League>().HasKey(m => m.LeagueId);
            modelBuilder.Entity<Player>().HasKey(m => new { m.PlayerId, m.LeagueId })
                .HasRequired<League>(m => m.League);
            modelBuilder.Entity<FantasyTeam>().HasKey(m => m.FantasyTeamId)
                .Property(m => m.FantasyTeamId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            modelBuilder.Entity<FantasyTeam>().HasMany(t => t.Players).WithMany(p => p.FantasyTeams).Map(mc =>
            {
                mc.ToTable("FantasyTeam_2_Player");
                mc.MapLeftKey("FantasyTeamId");
                mc.MapRightKey("PlayerId", "LeagueId");
            });
            base.OnModelCreating(modelBuilder);
        }
    }
于 2013-09-06T00:33:48.373 に答える