2

この質問が何度か聞かれるのを見たことがありますが、私は答えを理解していないのではないかと心配しています。

一言で言えば、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);

マッピングに何かが欠けていることは知っていますが、それを理解できないようです。助けてください。

4

1 に答える 1

1

具体的にどのコードが問題を引き起こしていますか?既存のエンティティを更新するとき、新しいエンティティを挿入するとき、または単に特定のエンティティを取得するときですか?サンプルコードも投稿できれば助かります。上記のスキーマ(BaseballStatエンティティのEntityBase継承を除く)を使用して小さなデモアプリを作成し、以下を問題なく実行しました。

var player = new Player()
    {
        PlayerBaseballStat = new PlayerBaseballStat()
        {
            BaseballStats = new Collection<BaseballStat>()
            {
                new BaseballStat()
                { 
                    StatName = "ERA", 
                    StatValue = 1.41M, 
                    Year = 2011
                }                                            
            }
        }
    };

    context.Players.Add(player);
    context.SaveChanges();

オブジェクトを初期化する方法である可能性があります。

于 2013-03-15T04:08:21.647 に答える