2013-03-03 65 views
1

我有以下實體模型。當我嘗試保存包含新帳戶的新用戶對象時,它會引發DBUpdateException:保存不會爲其關係提供外鍵屬性的實體時發生錯誤。管理實體框架中的複雜類型?

是否可以在不向模型中添加外鍵的情況下爲兩個對象提供映射。我討厭在我的模型中使用外鍵。 如果沒有其他解決方案,我將如何使用外鍵解決此問題?

public class User 
{ 
    public virtual int Id { get; set; } 
    public virtual Account Account { get; set; } 
} 

public class Account 
{ 
    public virtual int Id { get; set; } 
} 
+1

我不認爲這在EF中是可行的,導航屬性與FK緊密相關。 CF我的文章導航屬性在這裏如何做到這一點與FKs http://blog.staticvoid.co.nz/2012/7/17/entity_framework-navigation_property_basics_with_code_first – 2013-03-03 23:34:17

+0

@LukeMcGregor如何設置外鍵?什麼是命名約定?生成的數據庫在哪裏存儲?我想知道它是如何創建表格和關係的。 – aryaxt 2013-03-03 23:36:02

+0

看看我的文章,我會進入所有這些問題(除了可能存儲的位置,這是你的連接字符串定義的位置?是你的意思嗎?) – 2013-03-03 23:36:53

回答

2

這些類中的任何一個真的是「複雜類型」還是它們都具有自己對應表的實體?

如果它們是實體,則確實可以將EF配置爲不需要類中的外鍵屬性。在你的DbContext類,重寫OnModelCreating並添加一些像這樣的配置代碼:

modelBuilder.Entity<User>().HasRequired(u => u.Account).WithRequiredPrincipal(); 

如果我已經得到了這一權利,將配置一個「要求:要求」無需任何外鍵的屬性用戶和帳戶之間的關係在任何一類。

+0

這將取決於我,因爲我剛啓動應用程序,而且我還沒有創建任何表。這些表格是由實體自動生成的。擁有多個實體會更好嗎?或複雜的類型?有什麼不同?謝謝 – aryaxt 2013-03-04 00:31:16

+0

一個複雜類型將把這個類的屬性放到同一個表中。因此,例如,您添加到「帳戶」的任何屬性都將在「用戶」表中結束。它適用於諸如可以將街道名稱,城鎮,郵政編碼等整理到一個類中的地址,但不會將這些屬性拆分爲單獨的表格。 – 2013-03-04 00:32:37

+0

這不是一個不好的選擇,並會導致大數據集的性能問題?哪一個是首選方案? – aryaxt 2013-03-04 00:33:39

1

你必須從你的Account類中刪除屬性Id否則實體框架將把類Account作爲一個實體,而不是作爲一個複雜類型。