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

Gil*_*lit 91 entity-framework code-first entity-framework-ctp5

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

谢谢!

Sla*_*uma 148

您可以在属性中指定列顺序,例如:

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
}
Run Code Online (Sandbox Code Playgroud)

如果您使用a的Find方法,则DbSet必须考虑此关键参数的顺序.

  • InvalidOperationException:实体类型“XXX”具有使用数据注释定义的复合主键。要设置复合主键,请使用 Fluent API。 (2认同)

Mor*_*avi 52

要完成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 
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢 - 两种方法都可以正常工作.我更喜欢属性,因为我从代码生成我的类,属性更简洁. (2认同)

kar*_*ara 7

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; }
}
Run Code Online (Sandbox Code Playgroud)

这样,您就不必再次使用 Fluent-api。


Dan*_*sco 6

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

显然,您必须将配置文件添加到您的上下文中:

public class Ctp5Context : DbContext
{
    public DbSet<User> Users { get; set; }        

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
         modelBuilder.Configurations.Add(new UserConfiguration());
    }
}
Run Code Online (Sandbox Code Playgroud)