2012-08-03 124 views
0

對於EF Code First我相當陌生,這可能(希望!)是一個簡單的問題。用EF代碼優先映射單向關係

我有人民和地址之間的簡單關係:

People 
------ 
PersonID 
Name 

Address 
------- 
AddressID 
Address1 
PersonID 

大多數時候,我在我的人民表有AddressID;但這個數據庫有點「倒退」,因爲它引用了PersonID。在我的代碼中,我處理Person對象並希望獲取其關聯的地址。這種關係可能是1人擁有多個地址,但它總是1:1。 (這是第三方數據庫 - 我無法控制架構。)

如何在Code First中建立關係以關聯人員和地址?我使用的是流暢的API,但是我沒有看到在兩個實體中都沒有密鑰的情況下設置它的方法。理想情況下,我想我的實體將設立這樣的:

Person { 
public int PersonID {get;set;} 
public string Name {get;set;} 
//other person properites 

//navigation property 
public Address Address {get;set;} 
} 

Address { 
public string Address1 {get;set;} 
//other properties for address 

//navigation property 
public Person Person {get;set;} 
} 

我已經嘗試了一些方法來配置的關係,但它一直示數出來。我試過將Address類定義爲複雜類型,但由於它是一個單獨的表,可以工作嗎?另外,我嘗試過使用HasOptional和WithOptionalDependant,但無濟於事。

因此,有關如何最好地配置我的EF CF邏輯以使Address成爲Person中的實體的任何想法。

任何建議或幫助,非常感謝。

UPDATE 我在下面嘗試了Mark的建議,但我得到了一個不同的錯誤。 (見我的評論)

我的地址設置實體集PERSONID作爲實體鍵:

modelBuilder.Entity<Address>() 
.HasKey(a => a.PersonID); 

modelBuilder.Entity<Address>() 
.Property(a => a.PersonID) 
.HasColumnName(<my real column name>); 

所以實體在DB關鍵是PersonID,但它也是一個FK回人。這是造成這個問題嗎? (再次,不是我的DB - 這是第三方。)任何幫助,非常感謝。謝謝!!

回答

0

我想出了馬克的建議。

modelBuilder.Entity<Person>() 
    .HasOptional<Address>(p => p.Address) 
    .WithRequired(a => a.Person); 

我需要建立一個可選的:所需的映射,因爲一個人可能沒有地址(不太可能,但我想這是可能的),但地址有一個人因爲地址的PK是是PersonID。

當序列化結果時(我在控制器中將結果序列化爲JSON時,需要注意的是)Person和Address之間的循環引用。我解決這個通過了關於在那裏我獲得個人地址信息的情況下我的具體查詢(IES)禁止代理的創建:

_context.Configuration.ProxyCreationEnabled = false; 

一旦我做到了,我用延遲加載到過讓我的地址信息當我需要它的人,這一切工作。感謝所有的幫助!

1

你確定你想要1:1的關係嗎?

的關係,也可以是具有多個地址1人,但它始終 1:1。 (這是第三方數據庫 - 我無法控制模式。)

這意味着您實際上想要1:多關係正確嗎?

話雖這麼說,我覺得導航集將映射地址(ES),以Person對象的理想方式:

Person { 
public int PersonID {get;set;} 
public string Name {get;set;} 
//other person properites 

//navigation property 
public virtual ICollection<Address> Addresses {get;set;} 
} 

而這裏的相應流利(這裏假設你有一個是PersonID映射地址,當你描述數據庫,但不是在你的代碼時,你會這樣做)

modelBuilder.Entity<Person>() 
      .HasMany(p => p.Addresses) 
      .WithRequired(a => a.Person) 
      .HasForeignKey(a => a.PersonID); 
+0

感謝您的回答。我沒有嘗試1:多的設置。當我進行了您所建議的更改後,我得到了一個不同的錯誤 - 'Person_Addresses'關係中'多重性在角色'Person_Addresses_Target'中無效。因爲依賴角色反映了關鍵屬性,所以依賴角色的多重性的上界必須是'1'。在我的設置中,地址表的PK是PersonID,並且我有這個設置作爲我的實體鍵模型構建器設置。 – 2012-08-03 09:54:59

+0

我看到了 - 我誤解了你的設置,我認爲AddressId是桌子上的PK。也許[Table per Concrete Type](http://blogs.microsoft.co.il/blogs/gilf/archive/2010/01/25/table-per-concrete-type-in​​heritance-in-entity-framework.aspx)會幫助更多? – 2012-08-03 12:11:17