在Entity Framework Core中创建一个非聚集索引 [英] Create a non-clustered index in Entity Framework Core
问题描述
使用实体框架核心,我想拥有一个Guid PK,而不会在数据库中遇到页面碎片。 p>
我看到这个发布和这个一>。虽然可能在EF6中,它的做法似乎已经改变了。
是否可以在Entity Framework Core中创建一个非集群的主键,并有一个额外的索引?
Q& A答案如下。
可能使用EntityFrameworkCore v1.0.1或更高版本。
以下代码获得所需的结果:
using System;
使用Microsoft.EntityFrameworkCore;
使用Microsoft.EntityFrameworkCore.Metadata;
命名空间TestApplication.Models
{
///< summary>
///上下文类。从这一点开始迁移。
///< / summary>
public partial class TestApplicationContext:DbContext
{
public virtual DbSet< Company>公司{get;组;
public TestApplicationContext(DbContextOptions< TestApplicationContext> options):base(options)
{
}
protected override void OnConfiguring DbContextOptionsBuilder optionsBuilder)
{
//标准的东西在这里...
}
保护覆盖void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity< Company>(entity =>
{
entity.Property&Guid。(CompanyId)
.ValueGeneratedOnAdd();
实体。属性< int>(CompanyIndex)
.UseSqlServerIdentityColumn()
.ValueGeneratedOnAdd();
entity.Property(e => e.CompanyName)
.IsRequired()
.HasColumnType(varchar(100));
// ...在这里添加道具
entity.HasKey(e => e.CompanyId)
.ForSqlServerIsClustered(false)
.HasName(PK_Company);
entity.HasIndex(e => e.CompanyIndex)
.ForSqlServerIsClustered(true)
.HasName(IX_Company);
});
}
}
///< summary>
///这个模型 - 为了简洁而放在这里。
///< / summary>
public partial class公司
{
public Company()
{
}
public Guid CompanyId {get;组; }
public int CompanyIndex {get;组; }
public string CompanyName {get;组; }
//这里有更多的道具。
}
}
Project.json
{
version:1.0.0- *,
依赖
Microsoft.EntityFrameworkCore.Design:1.0.1,
Microsoft.EntityFrameworkCore.SqlServer:1.0.1,
Microsoft.EntityFrameworkCore.SqlServer.Design 1.0.1,
Microsoft.EntityFrameworkCore.Tools:1.0.0-preview3-final,
NETStandard.Library:1.6.0
},
tools:{
Microsoft.EntityFrameworkCore.Tools:1.0.0-preview3-final,
Microsoft.AspNetCore.Server.IISIntegration.Tools:1.0.0 -preview2-final
},
框架:{
netstandard1.6:{
imports:dnxcore50
}
}
}
Using Entity Framework Core, I want to have a Guid PK, without suffering page fragmentation in the database.
I have seen this post and this. Although it was possible in EF6, the way it's done seems to have changed.
Is it possible to create a non-clustered primary key in Entity Framework Core and have an additional index?
Q&A Answer below.
It is possible using EntityFrameworkCore v1.0.1 or greater.
The following code gets the desired result:
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
namespace TestApplication.Models
{
/// <summary>
/// The context class. Make your migrations from this point.
/// </summary>
public partial class TestApplicationContext : DbContext
{
public virtual DbSet<Company> Companies { get; set; }
public TestApplicationContext(DbContextOptions<TestApplicationContext> options) : base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// standard stuff here...
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Company>(entity =>
{
entity.Property<Guid>("CompanyId")
.ValueGeneratedOnAdd();
entity.Property<int>("CompanyIndex")
.UseSqlServerIdentityColumn()
.ValueGeneratedOnAdd();
entity.Property(e => e.CompanyName)
.IsRequired()
.HasColumnType("varchar(100)");
// ... Add props here.
entity.HasKey(e => e.CompanyId)
.ForSqlServerIsClustered(false)
.HasName("PK_Company");
entity.HasIndex(e => e.CompanyIndex)
.ForSqlServerIsClustered(true)
.HasName("IX_Company");
});
}
}
/// <summary>
/// The model - put here for brevity.
/// </summary>
public partial class Company
{
public Company()
{
}
public Guid CompanyId { get; set; }
public int CompanyIndex { get; set; }
public string CompanyName { get; set; }
// more props here.
}
}
Project.json
{
"version": "1.0.0-*",
"dependencies": {
"Microsoft.EntityFrameworkCore.Design": "1.0.1",
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.1",
"Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.1",
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview3-final",
"NETStandard.Library": "1.6.0"
},
"tools": {
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview3-final",
"Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final"
},
"frameworks": {
"netstandard1.6": {
"imports": "dnxcore50"
}
}
}
这篇关于在Entity Framework Core中创建一个非聚集索引的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!