2011-10-28 37 views
6

我有2個實體User和User_Profile(一對一關係)。使用Auto-Id的實體框架外鍵插入

public class User 
{ 
    [Key] 
    [ForeignKey("user_profile")] 
    public int user_id {get;set;} 

    public string username {get;set;} 
    public string email {get;set;} 

    public virtual User_Proile user_profile {get;set;} 
} 


public class User_Profile 
{ 
    [Key] 
    public int user_id {get;set;} 

    public string firstname {get;set;} 
    public string lastname {get;set;} 
} 

user_id是兩個SQL Server的用戶和User_Profile表中的一個PK:我有如下聯繫他們。它也被設置爲用戶表中的標識列。

當我嘗試通過EFDBContext Add/SaveChanges插入新記錄時。我收到以下錯誤:「user_rofile表中的user_id不能爲NULL」這非常合理,因爲這是一個PK列。我希望EF能夠從用戶身份獲取身份user_id,並在保存時將其插入User_Profile user_id。

這是可能的,如果是的話,我將如何實現?

更新:請注意,我手動創建了數據庫表和代碼類,所以我沒有通過.edmx文件訪問StoreGeneratedPattern。

回答

7

,我認爲有必要明確地配置一個一對一的關係用流利的API:

public class MyContext : DbContext 
{ 
    // ... your DbSets 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<User>() 
      .HasRequired(u => u.user_profile) 
      .WithRequiredPrincipal(); 
    } 
} 

與實體類:

public class User 
{ 
    [Key] 
    public int user_id {get;set;} 
    public string username {get;set;} 
    public string email {get;set;} 
    public virtual User_Profile user_profile {get;set;} 
} 

public class User_Profile 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int user_id {get;set;} 
    public string firstname {get;set;} 
    public string lastname {get;set;} 
} 

有必要在其中一個類中將DatabaseGeneratedOptionIdentity切換爲None。我已經交換了委託人和受撫養人,因爲User應該是委託人。 [ForeignKey(...)]不是必需的,因爲EF將User_Profile中的user_id識別爲FK特性,以User

像這樣的代碼...

using (var context = new MyContext()) 
{ 
    var user = new User(); 
    var userProfile = new User_Profile(); 

    user.user_profile = userProfile; 

    context.Users.Add(user); 
    context.SaveChanges(); 
} 

...應該工作,那麼,你希望和兩個相關實體保存到數據庫中。

+0

哇!正如你所說的那樣。許多感謝Slauma! – chrisg229

0

您必須設置StoreGeneratedPattern屬性身份在.edmx文件讓框架知道是由數據庫產生的磁場。此鏈接可以幫助...

Autonumber with Entity Framework

+1

我只是做了一個搜索,我的應用程序目錄中沒有.edmx文件。我正在使用EF4。我錯過了什麼嗎? – chrisg229

+0

恩,它應該在那裏。 .edmx文件基本上是您生成的模型,因此請查找具有該名稱的文件。或者您可以右鍵單擊解決方案資源管理器中的模型,然後使用xml編輯器打開它。 –

+0

我無法找到任何.edmx文件,我對模型的最接近的東西是我創建的class.cs文件。請注意,我手動創建了數據庫表和類(使屬性/列名相同),然後我實例化了DBContext並在web.config中建立適當的連接。一切似乎都很好......除了上面的身份問題。 – chrisg229