【问题标题】:Multiplicity constraint violated. The role xxx of the relationship xxx has multiplicity 1 or 0..1违反了多重性约束。关系 xxx 的角色 xxx 具有多重性 1 或 0..1
【发布时间】:2013-03-15 02:28:26
【问题描述】:

这个问题我看过几次,但恐怕我只是不明白答案。

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

我知道我在映射中遗漏了一些东西,但我似乎无法弄清楚。请帮忙。

【问题讨论】:

    标签: c# entity-framework data-binding


    【解决方案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- 我试图通过添加一个模仿您的模板化存储库模式的类来复制这个问题,并且一切仍然适用于您提供的架构。我的第一个想法是,您要撤回的数据中存在某种不匹配,某些记录不同步。数据如何进入您的存储库?
    • 数据是从外部来源吹进来的。数据可能是问题的一部分。同时,我从播放器对象中删除了 PlayerBaseballStat,因为它只需要一些管理功能而不是应用程序的其余部分。我稍后会重新讨论这个问题,因为我的截止日期非常艰难(棒球赛季)
    猜你喜欢
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多