2015-05-26 77 views
1

我有關於實體框架數據庫中的一對一關係的問題。一對一關係EF數據庫第一個

我有兩個表,一個用戶表和一個用戶詳細信息表。

用戶將包括登陸信息,用戶名,註冊日期和爲userDetails將有信息,如聯繫人信息,網站等 我的數據庫我user.id引用userdetails.userId。兩者都是主鍵。

因此,例如..

User: 
Id [Primary Key (incremented)] 
Password 
Salt 
RegisteredDate 

UserDetails 
UserId [Primary Key (References User.Id)] 
Firstname 
Contact 

我的問題是,我可以通過SQL Server添加記錄,但EF拋出異常。

如何在EF 6中成功創建一對一關係?

回答

0

UserDetails應該是:

UserDetails 
UserDetailId [Primary Key (incremented)] 
UserId [Foreign Key (References User.Id)] 
Firstname 
Contact 

您可以在foreign key

CREATE UNIQUE NONCLUSTERED INDEX [IX_UserId] ON [dbo].[UserDetails] 
(
    [UserId] ASC 
) ON [PRIMARY] 
+0

哦,我以爲你不需要一個userDetailsId,除非你創建一個到多個。 –

+0

不可以。您可以在您的外鍵上定義唯一索引 – Galma88

0

創建UNIQUE INDEX用這樣的模型嘗試:

public class User 
{ 
    public int Id { get; set; } 
    //... 

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

public class UserDetail 
{ 
    [Key,ForeignKey("User")] 
    public int UserId { get; set; } 
    //... 

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

這是使用Data Annotation。如果你想使用Fluent Api,您可以覆蓋OnModelCreating方法上的上下文是這樣的:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    // Configure UserId as PK for UserDetail 
    modelBuilder.Entity<UserDetail>() 
     .HasKey(e => e.UserId); 

    // Configure StudentId as FK for StudentAddress 
    modelBuilder.Entity<User>() 
       .HasOptional(u => u.UserDetail) // Mark UserDetail as optional for User 
       .WithRequired(ud=> ud.User); // Create inverse relationship 

} 

記住加密密碼字段。

+0

嗨,因爲我首先使用數據庫,我無法修改模型。密碼是加密的一種方式。 –

+0

問題是我不知道數據庫中的字段類型,但這是在EF中指定一對一關係的正確方法,只需查看關係映射,即使在數據庫中也必須這樣做第一。順便說一下,拋出你的例外是什麼? – octavioccl