簡體   English   中英

EF導航屬性不起作用?

[英]EF Navigation Properties not working?

我有卡類:

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;
    }

但是由於某種原因,我所有的Cards的Card.Stage都為空值-其中Card.StageId始終為整數。 我正在嘗試使導航屬性正常工作,以便可以通過卡訪問舞台的屬性。

我在這里做錯了什么?

更新:

當我嘗試通過測試訪問它們時,該屬性為null。 首先,我創建卡(在我的測試代碼中):

 var cardDto = new CardDto  // Works!
            {
                Details = "Test Card",
            };

然后,將其發送到我的Dto服務(也在測試代碼中):

 var fullCardDto = _service.AddCard(cardDto); // breaks because Stage is null when stageId is not

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;
}

_service是DTO服務:

public CardDto AddCard(CardDto card)
    {
        return new CardDto(_repository.AddCard(card.ToEntity()));
    }

上面是_repository代碼。

這在_repository調用中一直有效,但是如果我調試_repository.AddCard方法,則在調用SaveChanges()之后,StageId具有一個值,但是Stage沒有。

該卡在鏈上向上傳遞,直到應該再次轉換為Dto為止,該卡由於空階段而失敗。

奇怪的是,此代碼在測試之外仍然有效-如果我使用客戶端來訪問AddCard,我會得到一張沒有任何錯誤的卡。

要使延遲加載正常工作,您需要創建一個代理。 如果通過EF加載Card,您將自動收到一個包裝在代理對象中的對象。 你可以在這里做兩件事
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;
}
  1. 或者您可以使用顯式加載,

    公用卡AddCard(卡卡){int parentId = 0; 設置parentSet = null; 如果(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; } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM