【问题标题】:Entity framework navigation property is null实体框架导航属性为空
【发布时间】:2016-03-29 19:33:41
【问题描述】:

我有两个使用实体框架的模型。

public class Player
{

    public int PlayerId { get; set; }
    public string Name { get; set; }
    public string Sex { get; set; }
    public string Plays { get; set; }
    public string FavouriteSurface { get; set; }

}

public class SinglesMatch
{
    public int SinglesMatchId { get; set; }
    public int Player1Id { get; set; }
    public int Player2Id { get; set; }
    public int PlayerIdWinner { get; set; }
    public DateTime Date { get; set; }
    public string Venue { get; set; }
    public string Score { get; set; }
    public List<Player> Players { get; set; } 
}

我正在使用下面的代码尝试根据 SinglesMatch 模型中的 PlayerId 与 Player 模型中的 PlayerID 匹配来显示玩家的名称。

      @foreach (var item in @Model)
                    {

                        <ul id="Players" class="bg-success"></ul>
                        <br/>
                        <h3>Date - @Html.DisplayFor(@modelItem => item.Date)</h3>
                        <li>Venue - @Html.DisplayFor(@modelItem => item.Venue)</li>
                        <li>Player 1 - @Html.DisplayFor(@modelItem => item.Players.First(p => p.PlayerId == item.Player1Id).Name)</li>
                        <li>Player 2 - @Html.DisplayFor(@modelItem => item.Players.First(p => p.PlayerId == item.Player2Id).Name)</li>
                        <li>Score- @Html.DisplayFor(@modelItem => item.Score)</li>



                    }

调试时,从我的存储库中检索模型时,导航属性始终显示为 null。

我是否以正确的方式使用导航属性?我的查询有问题吗?

编辑以包含 DbContext:

    public TennisTrackerContext() : base("name=TennisTrackerContext")
    {

    }

    public DbSet<Player> Players { get; set; }
    public DbSet<PlayerRecord> PlayerRecords { get; set; }
    public DbSet<SinglesMatch> SinglesMatches { get; set; }
    public DbSet<DoublesMatch> DoublesMatches { get; set; }
    public DbSet<Venue> Venues { get; set; } 
}

}

【问题讨论】:

    标签: entity-framework linq asp.net-mvc-4 model


    【解决方案1】:

    您需要添加一个桥接表。 Sql 将自动创建它,但除非您在 c# 中创建它,否则您将无法访问这些变量。

    public class Player
        {
            public int PlayerId { get; set; }
            public string Name { get; set; }
            public string Sex { get; set; }
            public string Plays { get; set; }
            public string FavouriteSurface { get; set; }
            List<PlayerInMatch> Matches { get; set; }
    
            public Player()
            {
                Matches = new List<PlayerInMatch>();
            }
        }
    
        public class PlayerInMatch
        {
            public int Id { get; set; }
            public int PlayerId { get; set; }
            [ForeignKey("PlayerId")]
            public Player Player { get; set; }
            public int SinglesMatchId { get; set; }
            [ForeignKey("SinglesMatchId")]
            public SinglesMatch SinglesMatch { get; set; }
    
        }
    
        public class SinglesMatch
        {
            public int SinglesMatchId { get; set; }
            public int PlayerIdWinner { get; set; }
            public DateTime Date { get; set; }
            public string Venue { get; set; }
            public string Score { get; set; }
            public List<PlayerInMatch> Players { get; set; }
    
            public SinglesMatch()
            {
                Players = new List<PlayerInMatch>();
            }
        }
    
        static void Main(string[] args)
        {
            var match = new SinglesMatch();
            match.Players.Select(c => c.Player.Name);
        }
    

    【讨论】:

    • 正确。 OP 的模型需要重构才能做到这一点。这可能是一种方法。
    【解决方案2】:

    您需要将导航属性设为virtual 以启用延迟/急切加载:

    public class SinglesMatch
    {
    public int SinglesMatchId { get; set; }
    public int Player1Id { get; set; }
    public int Player2Id { get; set; }
    public int PlayerIdWinner { get; set; }
    public DateTime Date { get; set; }
    public string Venue { get; set; }
    public string Score { get; set; }
    
    public virtual List<Player> Players { get; set; } 
    }
    

    另外,你在fluent api中定义了SinglesMatchSingles之间的关系吗?

    编辑:我看到你没有通过注释或流利的 api 映射任何关系,我建议你看看这个:

    https://msdn.microsoft.com/en-us/data/jj591617.aspx

    【讨论】:

    • 嗨,我以为可能是这种情况所以切换到虚拟,但我得到了错误,receiveTemplates 只能用于字段访问、属性访问、单维数组索引或单-参数自定义索引器表达式。另外,在 fluent api 中定义关系是什么意思?非常感谢
    • 您能否编辑您的问题以包含您的DbContext?你的流利的 api 在那里
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多