Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF导航属性不工作?_C#_.net_Entity Framework_Ef Code First - Fatal编程技术网

C# EF导航属性不工作?

C# EF导航属性不工作?,c#,.net,entity-framework,ef-code-first,C#,.net,Entity Framework,Ef Code First,我有一门卡片课: public class Card { public Card(){} [Key] [Required] public virtual int CardId { get; set; } [ForeignKey("StageId")] public virtual Stage Stage { get; set; } public int StageId { get; set; } } } 还有舞台课: publ

我有一门卡片课:

public class Card
{
    public Card(){}

    [Key]
    [Required]
    public virtual int CardId { get; set; }

    [ForeignKey("StageId")]
    public virtual Stage Stage { get; set; }
    public int StageId { get; set; }
    }
}
还有舞台课:

public class Stage
{
    [Key]
    public virtual int StageId { get; set; }

    [DataMember(EmitDefaultValue = true)]
    public string Name { get; set; }

    public long Ticks { get; set; }

    [NotMapped]
    public TimeSpan Span
    {
        get { return TimeSpan.FromTicks(Ticks); }
    }

    // Make sure that these stages are generated accordingly
    public static class Ids
    {
        // Zero
        public const int One = 1;
        // Ten Seconds
        public const int Two = 2;
        // One Minute
    }

}
在我的存储库服务中,我有一个AddCard方法:

public Card AddCard(Card card)
    {
        int parentId = 0;
        Set parentSet = null;
        if (card.ParentSetId.HasValue)
        {
            parentId = card.ParentSetId.Value;
            parentSet = GetSet(parentId);
        }

        card.ParentSet = parentSet;
        card.ParentSetId = parentSet.SetId;

        card.StageId = Stage.Ids.One;  // Set Id here with hopes of getting card.Stage to resolve as a nav property

        _db.Cards.Add(card);

        SaveChanges();

        return card;
    }
但由于某些原因,我所有的卡的Card.Stage值都是空的,其中Card.StageId总是某个整数。我正在尝试让导航属性工作,这样我就可以通过一张卡访问舞台的属性

我做错了什么

更新:

当我尝试通过测试访问属性时,该属性为null。首先,我创建卡(在我的测试代码中):

然后我将其发送到我的Dto服务(也在测试代码中):

CardDto类别:

public class CardDto
{
    public CardDto(){}

    public CardDto(Card card)
    {
        CardId = card.CardId;
        Stage = card.Stage.Name;  // Fails here on its way back - creating the initial DTO works
        Details = card.Details;
    }

    [Key]
    [DataMember(EmitDefaultValue = true)]
    public int CardId { get; set; }


    [DataMember(EmitDefaultValue = true)]
    public string Stage { get; set; }

    [DataMember(IsRequired = false)]
    public string Details { get; set; }

    public Card ToEntity()
    {
        var newCard = new Card
            {
             CardId = CardId,
             Details = Details,
            };
        return newCard;
}
_服务是DTO服务:

public CardDto AddCard(CardDto card)
    {
        return new CardDto(_repository.AddCard(card.ToEntity()));
    }
\u存储库
代码在上面

这在_repository调用过程中一直有效,但如果调试_repository.AddCard方法,则在调用SaveChanges()之后,StageId有一个值,但Stage没有

该卡将沿着链向上传递,直到应该再次转换为Dto为止,由于空阶段,该卡将失败


奇怪的是,这段代码在测试之外工作——如果我使用客户机点击AddCard,我会得到一张没有任何错误的卡

要使延迟加载正常工作,您需要创建一个代理。如果你正在加载卡片 EF您将自动收到一个包裹在代理对象中的对象。您可以在这里做两件事
1.要使用延迟加载,可以创建如下代理

public Card AddCard(Card card)
    {
        var cardProxy= _db.Cards.Create(); 
        //and copy all values from card to cardProxy here..
        int parentId = 0;
        Set parentSet = null;
        if (cardProxy.ParentSetId.HasValue)
        {
            parentId = cardProxy.ParentSetId.Value;
            parentSet = GetSet(parentId);
        }
        cardProxy.ParentSet = parentSet;
        cardProxy.ParentSetId = parentSet.SetId;

        cardProxy.StageId = Stage.Ids.One;  // Set Id here with hopes of getting card.Stage to resolve as a nav property

          SaveChanges();

        return cardProxy;
}
  • 或者可以使用显式加载

    公共卡添加卡(卡片卡) { int parentId=0; Set parentSet=null; if(card.ParentSetId.HasValue) { parentId=card.ParentSetId.Value; parentSet=GetSet(parentId); }

            card.ParentSet = parentSet;
            card.ParentSetId = parentSet.SetId;
    
            card.StageId = Stage.Ids.One;  // Set Id here with hopes of getting card.Stage to resolve as a nav property
    
            _db.Cards.Add(card);
    
            SaveChanges();
    
            context.Entry(card).Reference(p => p.Stage).Load();//load stage here
    
           return card;
        }
    

  • 您是否检查了数据库数据?它是否具有卡的StageId值?好的,那么您是否启用了延迟加载或使用了Include?如何检索阶段?我没有禁用它,也没有禁用Include。阶段是通过上面代码中所示的ID访问的。我误解了您的问题吗?您能告诉我阶段所在的代码吗当你访问它时为空?@Jayantha哦!是的,现在发布非常感谢。我刚刚在你的博客上发布了一些东西。
    public Card AddCard(Card card)
        {
            var cardProxy= _db.Cards.Create(); 
            //and copy all values from card to cardProxy here..
            int parentId = 0;
            Set parentSet = null;
            if (cardProxy.ParentSetId.HasValue)
            {
                parentId = cardProxy.ParentSetId.Value;
                parentSet = GetSet(parentId);
            }
            cardProxy.ParentSet = parentSet;
            cardProxy.ParentSetId = parentSet.SetId;
    
            cardProxy.StageId = Stage.Ids.One;  // Set Id here with hopes of getting card.Stage to resolve as a nav property
    
              SaveChanges();
    
            return cardProxy;
    }
    
            card.ParentSet = parentSet;
            card.ParentSetId = parentSet.SetId;
    
            card.StageId = Stage.Ids.One;  // Set Id here with hopes of getting card.Stage to resolve as a nav property
    
            _db.Cards.Add(card);
    
            SaveChanges();
    
            context.Entry(card).Reference(p => p.Stage).Load();//load stage here
    
           return card;
        }