在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<Car>()
.HasKey(c => c.LicensePlate);
}
对于 组合主键,可以使用下面的代码
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Car>()
.HasKey(c => new { c.State, c.LicensePlate });
}
如果你要指定主键名称,可以用使用下面的代码
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.HasKey(b => b.BlogId)
.HasName("PrimaryKey_BlogId");
}
备用键
EF中还有一类键 是备用键,备用键 是唯一的,但他也是用来约束关系的。
使用关系数据库时,这将映射到备用键列上的唯一索引/约束和引用列的一个或多个外键约束的概念。
class MyContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Post>()
.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<Post> 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<Car>()
.HasAlternateKey(c => c.LicensePlate);
}
或者通过下面的代码将多个属性表示为备用键
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Car>()
.HasAlternateKey(c => new { c.State, c.LicensePlate });
}
最后你可以通过下面的代码指定备用键 的名称
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Car>()
.HasAlternateKey(c => c.LicensePlate)
.HasName("AlternateKey_LicensePlate");
}
版权声明:本文为hotmee原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。