首先在实体框架代码中,如何在多列上使用KeyAttribute

问题描述 投票:0回答:6

我正在创建一个 POCO 模型,与实体框架代码优先 CTP5 一起使用。 我正在使用 装饰来制作 PK 列的属性映射。 但是,如何在多个列上定义 PK,具体来说,如何控制索引中列的顺序? 这是类中属性顺序的结果吗?

编辑:查看@kara的答案以获取更新的解决方案。

谢谢!

entity-framework entity-framework-core entity-framework-4.1 code-first
6个回答
171
投票

注意: 截至 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
方法,则必须考虑关键参数的顺序。


75
投票

要完成 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 
        });
    }
}

13
投票

如果你像我一样更喜欢使用配置文件,你可以这样做(基于 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());
    }
}

13
投票

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 了。


1
投票

用作匿名对象:

modelBuilder.Entity<UserExamAttemptQuestion>().ToTable("Users").HasKey(o => new { o.UserId, o.Username }); 

0
投票

在 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.