2012-11-14 91 views
0

我想弄清楚如何防止實體框架在我的一個表上創建複合主鍵。我有以下兩個實體:阻止實體框架創建複合主鍵

public class Entry 
{ 
    public Int64 EntryID { get; set; } 
    public string UserName { get; set; } 
    public string EntrySubject { get; set; } 
} 

public class Revision 
{ 
    public Int64 RevisionID { get; set; } 
    public string RevisionDescription { get; set; } 

    public Int64 EntryID { get; set; } 
    public Entry Entry { get; set; } 
} 

當實體框架生成數據庫,修訂表得到由於RevisionId和的EntryID的複合主鍵。我希望修訂表的主鍵只能是RevisionID。有沒有辦法做到這一點? (我使用實體框架4.3與SQL Server CE,如果有差別。)

回答

0

您可以在修訂類中創建一個Key數據註釋,明確地定義你的關鍵:

public class Revision 
{ 
    [Key] 
    public Int64 RevisionID { get; set; } 
    public string RevisionDescription { get; set; } 

    public Int64 EntryID { get; set; } 
    public Entry Entry { get; set; } 
} 

,或者使用流利的:

modelBuilder.Entity<Revision>().HasKey(r=>r.RevisionID) 

編輯:添加測試應用程序和圖表

我創建了一個測試程序,用鑰匙註釋,並創建以下數據庫,與修訂表的主鍵,只有於RevisionId

enter image description here

整體上可應用的:

namespace ExampleCF 
{ 
    public class Entry 
    { 
     public Int64 EntryID { get; set; } 
     public string UserName { get; set; } 
     public string EntrySubject { get; set; } 
    } 

    public class Revision 
    { 
     [Key] 
     public Int64 RevisionID { get; set; } 
     public string RevisionDescription { get; set; } 

     public Int64 EntryID { get; set; } 
     public Entry Entry { get; set; } 
    } 

    public class ItemContext : DbContext 
    { 
     public DbSet<Entry> Entrys { get; set; } 
     public DbSet<Revision> Revisions { get; set; } 

     protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) 
     { 

     } 
    } 

    class Program 
    { 
     public static void Main() 
     { 
     } 

    } 
} 
+0

我試過兩個那些方法,但既不方法奏效。我有一個簡單的測試應用程序只有這兩個類,我只是確認添加鍵註釋不起作用。我仍然得到一個複合鍵。 –

+0

我創建了一個測試應用程序(發佈代碼),但沒有得到相同的結果 - 它按照預期創建了一個包含鍵的表。你能發佈你的測試應用程序嗎? –

+0

啊,我得到了兩個不同的結果。當我使用你的代碼並且只允許SqlExpress創建數據庫時,我得到和沒有組合主鍵一樣的結果。但是,當我在你的代碼中使用SQL Server CE並使用連接字符串設置指定CE數據庫(.sdf)時,我得到了組合鍵。所以這個問題似乎與SQL Server CE(我使用EntityFramework.SqlServerCompact NuGet包,v4.3.5)。所以我想我的問題變成了,使用CE時可以防止這種行爲。但是,我會檢查你的答案,因爲它導致遇到問題的根源。謝謝。 –