在Entity Framework Core中创建一个非聚集索引 [英] Create a non-clustered index in Entity Framework Core

查看:845
本文介绍了在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆