我有一个卡片类:
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 始终是某个整数。我正在尝试使导航属性正常工作,以便可以通过卡片访问舞台的属性。
我在这里做错了什么?
更新:
当我尝试通过测试访问它们时,该属性为空。首先我创建卡(在我的测试代码中):
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 方法,StageId 在我调用 SaveChanges() 后有一个值,但 Stage 没有。
Card 被传递回链,直到它应该再次转换为 Dto,由于 null Stage 它失败了。
奇怪的是,这段代码在测试之外工作——如果我使用客户端点击 AddCard,我会得到一张没有任何错误的卡。