如何首先映射实体框架4代码中的复合主键?
-
02-10-2019 - |
题
我首先要掌握EF4代码,并喜欢到目前为止。但是,我很难用复合主键将实体映射到表上。
我尝试过的配置看起来像这样:
public SubscriptionUserConfiguration()
{
Property(u => u.SubscriptionID).IsIdentity();
Property(u => u.UserName).IsIdentity();
}
抛出此例外:无法推断实体类型“订阅者”的密钥。
我想念什么?
解决方案
你也可以使用
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 });
}
那么,如何设置一个实体,即联接表具有由外国钥匙组成的主键?
其他提示
我将尝试使用以下实体逐步解释它
public class Account
{
public int AccountId1 { get; set; }
public int AccountId2 { get; set; }
public string Description { get; set; }
}
创建从
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 } }
创建从
DbContext
对象,覆盖OnModelCreating
方法并添加新的AccountEntityTypeConfiguration
对象符合模型构建器的配置。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);
}
不隶属于 StackOverflow