2013-03-15 215 views
2

我见过这个问题问了几次,但我恐怕我只是不理解答案。违反了多重性约束。关系xxx的角色xxx具有多重性1或0..1

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

我知道我缺少的东西映射,但我似乎无法推测出来。请帮忙。

回答

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

它可能是你如何初始化的对象。

+0

感谢您的回复。我添加了一些关于何时发生错误以及如何造成的附加信息。它目前发生在读取操作上。我还没有测试过更新/插入功能。 – jason 2013-03-15 12:12:30

+0

杰森 - 我试图通过添加一个模仿你的模板库模式的类来复制这个问题,并且所有东西仍然适用于你提供的模式。我的第一个想法是,你的数据在某种程度上与你的数据不匹配,即某些记录不同步。数据如何进入您的存储库? – 2013-03-15 18:38:40

+0

数据从外部来源被吹入。数据可能是问题的一部分。与此同时,我从播放器对象中删除了PlayerBaseballStat,因为它只需要一些管理功能,而不是其他应用程序。之后我会再次回顾这个问题,因为我有一个非常艰难的截止日期(棒球赛季) – jason 2013-03-16 18:46:53