2012-11-17 67 views
2

我已閱讀關於獨立關聯的文章,從Ladislav。我檢查了他在link中提供的信息。該信息是相當有用的,它揭示了一些光。 但是我想模擬我可以訪問的現有數據庫。它有三個表用戶,證書和測驗。具有代碼第一獨立關聯或外鍵關聯的EF模型

起初我想到建模作爲獨立的關聯。爲什麼?我的用戶表具有主鍵UserID和證書表具有PK CertID和列UserID,我可以說是一個外鍵。就在我認爲它是一對多關係時,我意識到Users表中的某個UserID在Certificates表中找不到。但是,證書中的所有用戶標識都可以在用戶表中找到。

我的問題是我應該使用獨立的關聯,如果有的話如何實現這一點,我的用戶表成爲主要類和證書之一的依賴。這樣,我可以顯示或從我的用戶表中獲取值,然後從我的asp.net mvc 3應用程序的證書表中讀取值。

請更正此代碼下面這說明什麼,我打算做到我上面說:

public class Certificates 
{ 
    [Key] 
    public Users CertID { get; set; } 
    public int ID { get; set; } 
    public DateTime recvd { get; set; } 
    public int QuizID { get; set; } 


} 

public class Users 
{ 
    public int ID { get; set; } 
    public string LastName { get; set; } 
    public string FirstName { get; set; } 
    public string email { get; set; } 
    public ICollection<Certificates> Certificates { get; set; } 
} 

public class Quiz 
    { 
     public int QuizID { get; set; } 
     public string QuuizName { get; set; } 
     public int VolumeNo { get; set; } 
     public int mark { get; set; } 
     public ICollection<Certificates> Certificates { get; set; } 
    } 

public class cpdContext : DbContext 
{ 
    public DbSet<Certificates> Certificates { get; set; } 
    public DbSet<Users> Users { get; set; } 
    public DbSet<Users> Quiz { get; set; } 

最後我怎麼顯示的細節與這三個類與能力的信息視圖來添加用戶標誌和測試。測驗和證書之間我想要建模的關係是1對多。

回答

2

我的Users表中有主鍵UserID和Certificates表有PK CertID和一個UserID我可以說是一個外鍵。就在 我認爲它是一對多的關係時,我意識到Users表中的一些UserID 在Certificates表中找不到。但是,可以在用戶表中找到證書中的所有用戶ID 。

這對於一個一對多的關係,其中User非常正常的本金和Certificate依賴,你必須強制執行的關係的約束。

我不認爲這是決定獨立或外鍵關聯的參數。據我可以告訴你可以映射一個數據庫架構與兩種關聯類型。數據庫模式不應該是決定的驅動因素。 Ladislav的帖子已經鏈接了所有細節。還有其他百分點,比數據庫架構,將指導決定:

  • 架構:對象和關係世界的嚴格分離,這可能會導致您不希望有一個「外鍵」財產關係的決定您的對象模型中的工件。這有利於獨立的協會。
  • 易用性:在某些情況下,額外的外鍵屬性可以更輕鬆地處理關係,尤其是更新它們。這一點是針對外鍵關聯的。
  • 性能:在較大型號的某些情況下,EF的外鍵關聯速度更快。

上面的個人觀點2提示我在大多數情況下的秤,但正如所說的都是可能的。

映射與外鍵關聯(我省略除了PK,FK和導航性能的所有屬性,以保持它的簡稱):

public class Certificates 
{ 
    [Key] 
    public int CertID { get; set; } 

    [ForeignKey("User")] 
    public int UserID { get; set; } 
    [ForeignKey("Quiz")] 
    public int QuizID { get; set; } 

    public Users User { get; set; } 
    public Quiz Quiz { get; set; } 
} 

public class Users 
{ 
    public int ID { get; set; } 
    public ICollection<Certificates> Certificates { get; set; } 
} 

public class Quiz 
{ 
    public int QuizID { get; set; } 
    public ICollection<Certificates> Certificates { get; set; } 
} 

這是假定兩者的關係是必需的,即在數據庫FKS不可爲空。如果他們是你需要使FK屬性爲空(int?)。您可以使用Fluent API代替數據註釋,與以下示例類似(但不完全相同!)。

映射與獨立協會:

public class Certificates 
{ 
    [Key] 
    public int CertID { get; set; } 

    public Users User { get; set; } 
    public Quiz Quiz { get; set; } 
} 

public class Users 
{ 
    public int ID { get; set; } 
    public ICollection<Certificates> Certificates { get; set; } 
} 

public class Quiz 
{ 
    public int QuizID { get; set; } 
    public ICollection<Certificates> Certificates { get; set; } 
} 

public class cpdContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entitiy<Users>() 
      .HasMany(u => u.Certificates) 
      .WithRequired(c => c.User) // or WithOptional 
      .Map(m => m.MapKey("UserID")); //<- DB FK column name 

     modelBuilder.Entitiy<Quiz>() 
      .HasMany(u => u.Certificates) 
      .WithRequired(c => c.Quiz) // or WithOptional 
      .Map(m => m.MapKey("QuizID")); //<- DB FK column name 
    } 
} 

Certificates的導航性能不要求(無論是在第一還是第二個例子),你可以刪除它們,如果你不需要他們,只是使用然後使用無參數WithRequired(),並在第一個示例中使用Fluent API。 (Users類中Certificates集合上的[ForeignKey("UserID")]註釋可能也適用。)

+0

感謝Slauma。我遵循你的建議,並喜歡我不瞭解的Fluent API。閱讀相關數據時,我可以從證書讀取到用戶,即從多人到一個,但我無法從用戶讀取我想要執行的證書的相關信息。 – Sithelo

+0

@Sithelo:我無法從你的評論中發現問題。如果可能的話,請爲您的問題創建一個新問題,您可以在其中顯示查詢以及哪些內容有效,哪些內容無效。 – Slauma