2012-11-14 62 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时可以防止这种行为。但是,我会检查你的答案,因为它导致遇到问题的根源。谢谢。 –