多重性约束被违反。关系 xxx 的角色 xxx 具有多重性 1 或 0..1。

3

我看到这个问题被问了几次,但我恐怕没有理解答案。

简而言之,我有一个包含PlayerBaseballStat类型属性的Player。它是一对一关系。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);

我知道映射中缺少了什么,但似乎无法弄清楚。请帮忙。

2个回答

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();

这可能与您初始化对象的方式有关。

谢谢回复。我添加了一些关于错误发生的时间以及其原因的额外信息。它目前发生在读取操作中。我还没有测试更新/插入功能。 - jason
Jason- 我尝试通过添加一个类来模仿你的模板存储库模式来复制这个问题,使用你提供的架构一切仍然正常。我的第一个想法是你拉回的数据中存在某种不匹配,有些记录不同步。你的数据是如何进入存储库的? - Derek Van Cuyk
数据是从外部来源导入的。这些数据可能是问题的一部分。同时,我已经从球员对象中删除了PlayerBaseballStat,因为它仅用于某些管理功能,而不是应用程序的其余部分。由于我有一个非常紧迫的截止日期(棒球赛季),所以稍后我会重新审视这个问题。 - jason

0
问题在于您正在Player构造函数中初始化PlayerBaseballStat。类似问题在这里
需要消除这个问题:
// initialize with empty shell

    PlayerBaseballStat = new PlayerBaseballStat();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接