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字段都與地址類中的Id相關,但不幸的是沒有在數據庫中設置爲外鍵。

我相信我試圖實現的關係是多方面的。即一個訂單有一個發貨地址(地址),但地址可以是許多訂單的發貨地址。

我試過以下的多種變化:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 

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

} 

但每次我嘗試訪問Order.ShippingAddress.FirstName的時候,我得到一個空引用異常。

是我想要實現的可能嗎?

+0

你是先使用代碼嗎? – dakait 2013-03-08 10:02:33

回答

1

如果禁用了延遲加載,你需要「包括」的導航屬性在查詢

您可以通過以下方式之一進行:

context.Orders.Include(o=>o.ShippingAddress).Where..... // make sure you are `using System.Data.Entity;` 
context.Orders.Include("ShippingAddress").Where..... 

此外,如果你的關係是可選的,你將需要使FK id可爲空,例如:

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

謝謝你。我現在得到一個InvalidOperationException。 '指定的包含路徑無效。 EntityType'Model.Order'不聲明名爲'ShippingAddress'的導航屬性。我可能會錯過顯而易見的東西,但我確定我已經宣佈了它? – rmorrin 2013-03-08 10:22:00

+1

@rmorrin您是否將密鑰更改爲可空?從你在這裏所說的話你在你實際的導航屬性設置中有點不習慣。從你上面的例子來看,這是我能看到的唯一問題。我也假設你也有一個類似的模型綁定的billingAddress – 2013-03-08 10:41:00