如何首先在Entity Framework 4代码中映射组合主键?

我正在处理EF4代码,并喜欢它到目前为止。 但是,我有一个实体映射到复合主键的表。

我试过的configuration如下所示:

public SubscriptionUserConfiguration() { Property(u => u.SubscriptionID).IsIdentity(); Property(u => u.UserName).IsIdentity(); } 

哪个引发此exception:无法推断实体types“SubscriptionUser”的键。

我错过了什么?

你也可以使用

 HasKey(u => new { u.SubscriptionID, u.UserName }); 

编辑:

我发现的一个限制是以下不起作用:

 public ProjectAssignmentConfiguration() { HasKey(u => u.Employee.EmployeeId); HasKey(u => u.Project.ProjectId); } 

要么

 public ProjectAssignmentConfiguration() { HasKey(u => new { u.Employee.EmployeeId, u.Project.ProjectId }); } 

那么如何build立一个连接表有一个由外键组成的主键的实体呢?

我将尝试使用下面的实体一步一步地解释它

 public class Account { public int AccountId1 { get; set; } public int AccountId2 { get; set; } public string Description { get; set; } } 
  1. 创build一个派生自EntityTypeConfiguaration<TEntity>对象的类来覆盖约定

     class AccountEntityTypeConfiguration : EntityTypeConfiguration<Account> { public AccountEntityTypeConfiguration() { // The Key // The description of the HasKey Method says // A lambda expression representing the property to be used as the primary key. // If the primary key is made up of multiple properties then specify an anonymous type including the properties. // Example C#: k => new { k.Id1, k.Id2 } // Example VB: Function(k) New From { k.Id1, k.Id2 } this.HasKey(k => new { k.AccountId1, k.AccountId2 } ); // The Key // Maybe the key properties are not sequenced and you want to override the conventions this.Property(p => p.AccountId1).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None); this.Property(p => p.AccountId2).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None); this.Property(p => p.Description).IsRequired(); // This property will be required this.ToTable("Account"); // Map the entity to the table Account on the database } } 
  2. 创build从DbContext对象派生的类时,请重写OnModelCreating方法,并将新的DbContext对象添加到模型构build器的configuration中。

     public class MyModelAccount : DbContext { public DbSet<Account> Accounts { get; set;} protected override void OnModelCreating(DbModelBuilder modelBuilder) { // Add a new AccountEntityTypeConfiguration object to the configuration of the model, that will be applied once the model is created. modelBuilder.Configurations.Add(new AccountEntityTypeConfiguration()); } } 

希望它可以帮助你!

你也可以使用Column属性

 public class UserProfileRole { [Key, Column(Order = 0)] public int UserId { get; set; } [Key, Column(Order = 1)] public int RoleId { get; set; } } 

解决了它:我应该使用HasKey,而不是身份。 这工作:

 public SubscriptionUserConfiguration() { HasKey(u => u.SubscriptionID); HasKey(u => u.UserName); }