관계의 대상이 될 속성을 구성하려고하지만 개체가 구체화 될 때 EF에서 getter 또는 setter를 사용하지 않으려합니다. 왜냐하면 거기에 비즈니스 로직이 있기 때문입니다.
DispatchItem.cs :
public class DispatchItem {
private PurchaseOrderItem _purchaseOrderItem;
public PurchaseOrderItem PurchaseOrderItem {
get => _purchaseOrderItem;
set {
_purchaseOrderItem = value;
throw new Exception("This shouldn't be called");
}
}
public Guid? PurchaseOrderItemId { get; set; }
}
이 (DBContext.cs)와 같은 백업 필드를 구성했습니다.
modelBuilder.Entity<DispatchItem>().Property(di => di.PurchaseOrderItem).UsePropertyAccessMode(PropertyAccessMode.Field);
modelBuilder.Entity<DispatchItem>().Property(di => di.PurchaseOrderItemId).HasColumnName("purchase_order_item_id");
modelBuilder.Entity<DispatchItem>().HasOne(di => di.PurchaseOrderItem).WithMany(poi => poi.DispatchItems).HasForeignKey(di => di.PurchaseOrderItemId);
그러나 그것은 던졌습니다 :
Exception thrown: 'System.InvalidOperationException' in Microsoft.EntityFrameworkCore.dll
The navigation property 'PurchaseOrderItem' cannot be added to the entity type 'DispatchItem' because a property with the same name already exists on entity type 'DispatchItem'.
UsePropertyAccessMode
문을 제거하면 객체가 뒷받침 필드 대신 구체화 될 때 setter가 사용됩니다.
탐색 속성에 대해 배킹 필드 사용을 구성 할 수는 있지만 기본 속성에 대한 Property
메서드가 아니라 현재 유창 API (이 시점에는 존재하지 않음)를 통해가 아니라 관계와 관련된 변경 가능한 모델 메타 데이터를 통해 직접 설정할 수 있습니다.
modelBuilder.Entity<PurchaseOrder>()
.HasMany(e => e.LineItems)
.WithOne(e => e.PurchaseOrder) // or `WithOne() in case there is no inverse navigation property
.Metadata.PrincipalToDependent.SetPropertyAccessMode(PropertyAccessMode.Field); // <--
다음을 사용하여 모든 엔티티 탐색 속성에 대한 모드를 설정할 수도 있습니다 (여전히 개별 속성에 대해이를 재정의 할 수 있습니다).
modelBuilder.Entity<PurchaseOrder>()
.Metadata.SetNavigationAccessMode(PropertyAccessMode.Field);