2015-08-29 77 views
1

我有以下型號:實體框架創建一個另一列一一對應關係

public class ApplicationUser : IdentityUser 
{ 

    public int? StudentId { get; set; } 
    public virtual Student Student { get; set; } 
} 

public class Student : BaseEntity 
{ 
    public string UserId { get; set; } 
    public virtual ApplicationUser User { get; set; } 

    public string CreatedById { get; set; } 
    public virtual ApplicationUser CreatedBy { get; set; } 
} 

正如你可以看到我有學生和ApplicationUser之間的兩個一對一的關係,所以在ModelCreating我定義如下:

modelBuilder.Entity<ApplicationUser>() 
       .HasOptional(u => u.Student) 
       .WithRequired(s => s.User); 

當數據庫發生的一切是除了列名很好,我希望在學生創建的列是用戶ID,但它創造列的userid簡單列,並創建了另一列USER_ID關係。

如何在Student中定義屬性UserId是關係的屬性?

+0

我不認爲你的實體配置正確......學生必須從ApplicationUser下來,或者用戶必須從學生... – drneel

回答

1

你想要做的是有一個明確的定義和映射的外鍵,它應該是這樣的:

modelBuilder.Entity<ApplicationUser>() 
      .HasOptional(u => u.Student) 
      .WithRequired(s => s.User) 
      .HasForeignKey(u => u.UserId); 

,如果你沒有明確指定,則自動生成的外鍵被創建以下的[{PropertyName}_Id]

+0

是否有配置該vía註釋,或者是否只有可能流利的API? – Escobar5

+0

@ Escobar5你可以嘗試在UserId的頂部添加[Key]和[ForeignKey(「User」)]? – renakre

+0

「,如果您沒有明確指定,則按照[{PropertyName} _Id]的命名約定創建自動生成的外鍵」,這不完全是真的。在一對一關係中的約定是使用兩個實體的PK。僅僅因爲存在第二個關係(CreatedBy),需要指定一個關係,否則它將遵循這個命名約定,因爲它隱式地是一對多的。 – DevilSuichiro

0

的命名約定你需要指明的外鍵與去其導航屬性:

public class Student : BaseEntity 
{ 
    public string UserId { get; set; } 

    [ForeignKey("UserId")] 
    public virtual ApplicationUser User { get; set; } 

    public string CreatedById { get; set; } 

    [ForeignKey("CreatedById")] 
    public virtual ApplicationUser CreatedBy { get; set; } 
} 

https://msdn.microsoft.com/en-us/data/jj591583.aspx#Relationships

相關問題