この質問が何度か聞かれるのを見たことがありますが、私は答えを理解していないのではないかと心配しています。
一言で言えば、PlayerBaseballStatタイプのプロパティを含むPlayerがあります。その1対1の関係。PlayerBaseballStatにはICollection<BaseballStat>
プロパティがあります。PlayerBaseballStatとBaseballStatの両方に、関係に参加するためのPlayerIdがあります。
public class Player
{
public Player()
{
// initialize with empty shell
PlayerBaseballStat = new PlayerBaseballStat();
}
public int PlayerId { get; set; }
//other properties removed for brevity
public virtual PlayerBaseballStat PlayerBaseballStat { get; set; }
}
public class PlayerBaseballStat
{
[Required, Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int PlayerId { get; set; }
public virtual Player Player { get; set; }
//other properties removed for brevity
public virtual ICollection<BaseballStat> BaseballStats { get; set; }
}
public class BaseballStat : EntityBase
{
public int PlayerId { get; set; }
public virtual Player Player { get; set; }
public int Year { get; set; }
[MaxLength(25)]
[Required]
public string StatName { get; set; }
[Required]
public decimal StatValue { get; set; }
}
マッピングは次のとおりです。
modelBuilder.Entity<Player>()
.HasOptional(p => p.PlayerBaseballStat);
modelBuilder.Entity<PlayerBaseballStat>()
.HasRequired<Player>(x => x.Player);
modelBuilder.Entity<PlayerBaseballStat>()
.HasMany(p => p.BaseballStats);
modelBuilder.Entity<BaseballStat>()
.HasKey(x => new { x.PlayerId, x.Year, x.StatName });
modelBuilder.Entity<BaseballStat>()
.HasRequired(x => x.Player);
データアクセス層は、テンプレート化されたリポジトリです。多重度制約違反は、読み取り操作で発生します。
public T Get(Expression<Func<T, bool>> where)
{
return dbset.Where(where).FirstOrDefault<T>();
}
実際の読み取りは
_playerBaseballStatsRepository.Get(x => x.PlayerId == playerId);
それはに変換されます
dataContext.PlayerBaseballStats.FirstOrDefault(x => x.PlayerId == playerId);
マッピングに何かが欠けていることは知っていますが、それを理解できないようです。助けてください。