backing field란 private field를 DB에 매핑하는 것을 말한다.
추가로 Navigation property에서도 사용 가능하다
public class ItemReview
{
public int ItemReviewId { get; set; }
public int Score { get; set; }
}
public class Item
{
// 다른 클래스 참조하는 외래키 (navigational property)
public IEnumerable<ItemReview> Reviews { get { return _reviews.ToList(); } } // set은 불가능
private readonly List<ItemReview> _reviews = new List<ItemReview>(); // set불가
public double? AverageScore { get; set; }
public void AddReview(ItemReview review) // set할때 반드시 AverageScore도 갱신되도록
{
_reviews.Add(review);
AverageScore = _reviews.Average(r => r.Score);
}
public void RemoveReview(ItemReview review)
{
_reviews.Remove(review);
AverageScore = _reviews.Any() ? _reviews.Average(r => r.Score) : (double?)null;
// Any() : 하나라도 있으면 true
}
builder.Entity<Item>()
.Metadata
.FindNavigation("Reviews")
.SetPropertyAccessMode(PropertyAccessMode.Field);