EntityFrameworkCore(3)-键

在EF中,大多数实体都有一个键,一般命名是Id或者类型名称+Id,这俩种EF是可以自动识别的。

class Car
{
    public string Id { get; set; }

    public string Make { get; set; }
    public string Model { get; set; }
}

class Truck
{
    public string TruckId { get; set; }

    public string Make { get; set; }
    public string Model { get; set; }
}

但是如果我们不是这样命名的怎么办?

我们可以同指定属性的主键来实现,俩种办法

直接添加[Key]特性。

class Car
{
    [Key]
    public string LicensePlate { get; set; }

    public string Make { get; set; }
    public string Model { get; set; }
}

或者使用模型构造器

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity()
        .HasKey(c => c.LicensePlate);
}

对于 组合主键,可以使用下面的代码

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity()
        .HasKey(c => new { c.State, c.LicensePlate });
}

如果你要指定主键名称,可以用使用下面的代码

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity()
        .HasKey(b => b.BlogId)
        .HasName("PrimaryKey_BlogId");
}

备用键

EF中还有一类键 是备用键,备用键 是唯一的,但他也是用来约束关系的。

使用关系数据库时,这将映射到备用键列上的唯一索引/约束和引用列的一个或多个外键约束的概念。

class MyContext : DbContext
{
    public DbSet Blogs { get; set; }
    public DbSet Posts { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity()
            .HasOne(p => p.Blog)
            .WithMany(b => b.Posts)
            .HasForeignKey(p => p.BlogUrl)
            .HasPrincipalKey(b => b.Url);
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public string BlogUrl { get; set; }
    public Blog Blog { get; set; }
}

你也已通过下面的代码将单个属性标识位备用键

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity()
        .HasAlternateKey(c => c.LicensePlate);
}

或者通过下面的代码将多个属性表示为备用键

 

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity()
        .HasAlternateKey(c => new { c.State, c.LicensePlate });
}

最后你可以通过下面的代码指定备用键 的名称

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity()
        .HasAlternateKey(c => c.LicensePlate)
        .HasName("AlternateKey_LicensePlate");
}

 

你可能感兴趣的:(EntityFrameWork)