1

불행히도 변경할 수없는 기존 데이터베이스를 사용하고 관계를 만드는 데 문제가있는 것으로 보입니다. 필자는 EF에 비교적 익숙하지 않은데, 일부 검색 결과 사용자가 비슷한 것을 얻으려는 시도를 한 적이 있지만 주어진 상황에서이 조언이 제공되지 않는 것 같습니다.EF를 사용하여 기존 데이터베이스의 관계 매핑

나는 다음과 같은 클래스가 있습니다

public partial class Order 
{ 
    public int Id { get; set; } 
    public int BillingAddressId { get; set; } 
    public int ShippingAddressId { get; set; } 
    //more values 

    public virtual Address ShippingAddress { get; set; } 
    public virtual Address BillingAddress { get; set; } 
} 

public partial class Address 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    //more values 
} 
나는 순서 내에서 탐색 속성을 통해 배송/결제 주소를 액세스 할 수 있도록하고 싶습니다

. ShippingAddressId/BillingAddressId 필드는 Address 클래스에서 Id과 관련이 있지만 데이터베이스에 외래 키로 설정되지는 않습니다.

저는 달성하려는 관계가 많은 것이라고 믿습니다. 즉, 주문에는 배송 주소 (주소)가 하나 있지만 주소는 여러 주문의 배송 주소가 될 수 있습니다.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 

    modelBuilder.Entity<Order>().HasOptional(o => o.ShippingAddress) 
     .WithMany() 
     .HasForeignKey(o => o.ShippingAddressId); 

} 

는하지만 Order.ShippingAddress.FirstName에 액세스하려고 할 때마다, 나는 null 참조 예외를 얻을 :

나는 다음과 같은 여러 변화를 시도했습니다.

가능한 것을 얻으 려하고 있습니까?

+0

먼저 FK ID를 Nullable로 만들 필요가 있습니까? – dakait

답변

1

당신은 당신이 당신의 쿼리에서 탐색 속성을 '포함'으로해야합니다 비활성화 게으른 로딩이있는 경우

다음 중 하나를 사용하여이 작업을 수행 할 수 있습니다

당신의 관계뿐만 아니라
context.Orders.Include(o=>o.ShippingAddress).Where..... // make sure you are `using System.Data.Entity;` 
context.Orders.Include("ShippingAddress").Where..... 

경우 선택 사항 : 예 :

public int? BillingAddressId { get; set; } 
public int? ShippingAddressId { get; set; } 
+0

감사합니다. 이제 InvalidOperationException이 발생합니다. '지정된 포함 경로가 유효하지 않습니다. EntityType 'Model.Order'는 이름이 'ShippingAddress'인 탐색 속성을 선언하지 않습니다. 나는 명백한 것을 놓치고 있을지도 모른다. 그러나 나는 내가 그것을 선언했다라고 확신한다? – rmorrin

+1

@rmorrin 키를 null로 변경할 수 있습니까? 당신이 여기에서 말했던 것에서 당신은 당신의 실제 nav 속성 설정에서 다소 불안정한 것을 가지고 있습니다. 위의 예에서 볼 수있는 유일한 문제입니다. 당신도 billingAddress와 비슷한 모델 바인드를 가지고 있다고 가정합니다. –