我正在创建一个 POCO 模型,与实体框架代码优先 CTP5 一起使用。 我正在使用
编辑:查看@kara的答案以获取更新的解决方案。
谢谢!
注意: 截至 2019 年,此答案对于更高的 EntityFramework 版本变得无效。
您可以在属性中指定列顺序,例如:
public class MyEntity
{
[Key, Column(Order=0)]
public int MyFirstKeyProperty { get; set; }
[Key, Column(Order=1)]
public int MySecondKeyProperty { get; set; }
[Key, Column(Order=2)]
public string MyThirdKeyProperty { get; set; }
// other properties
}
如果您使用
Find
的 DbSet
方法,则必须考虑关键参数的顺序。
要完成 Slauma 提交的正确答案,您还可以使用 HasKey 方法指定复合主键的顺序:
public class User
{
public int UserId { get; set; }
public string Username { get; set; }
}
public class Ctp5Context : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().HasKey(u => new
{
u.UserId,
u.Username
});
}
}
如果你像我一样更喜欢使用配置文件,你可以这样做(基于 Manavi 的示例):
public class User
{
public int UserId { get; set; }
public string Username { get; set; }
}
public class UserConfiguration : EntityTypeConfiguration<User>
{
public UserConfiguration()
{
ToTable("Users");
HasKey(x => new {x.UserId, x.Username});
}
}
显然你必须将配置文件添加到你的上下文中:
public class Ctp5Context : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new UserConfiguration());
}
}
在 EF Core 7.0 中,引入了类的新属性
[PrimaryKey]
。
示例:
[PrimaryKey(nameof(FirstName),nameof(LastName))]
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string SomeProperty { get; set; }
}
这样,您就不必再次使用 Fluent-api 了。
用作匿名对象:
modelBuilder.Entity<UserExamAttemptQuestion>().ToTable("Users").HasKey(o => new { o.UserId, o.Username });
在 EF 或 EF Core 中,不支持使用 Column Order 属性来指定键顺序,因此最佳实践是在 DbContext 的 OnModelCreating 方法中配置组合键。
public class MyEntity
{
public int MyFirstKeyProperty { get; set; }
public int MySecondKeyProperty { get; set; }
public string MyThirdKeyProperty { get; set; }
// Other properties
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<MyEntity>()
.HasKey(e => new { e.MyFirstKeyProperty, e.MySecondKeyProperty, e.MyThirdKeyProperty });
base.OnModelCreating(modelBuilder);
}