如何为SQL Azure代码优先迁移创建群集主键索引?

时间:2015-04-15 13:17:42

标签: sql-server entity-framework azure azure-sql-database azure-mobile-services

我尝试将空间列添加到SQL Azure中的表中。当我尝试在该列上创建空间索引时,我收到一条错误消息,说我需要一个主键聚簇索引。很公平,但我想要更改的表是父表,我需要删除相应的表并使用主键聚簇索引重新创建表。这很容易通过sql完成,但是当我们需要在多个开发盒上重新创建数据库时,这会变得乏味。所以我想手动编辑代码优先迁移来完成繁重的任务。 SQL Azure的推荐方法是使您的类继承自Entity-Data,因此我的表的代码优先创建如下所示:

CreateTable("sbp_ct.Tiles", c => new {
    Id = c.String(nullable: false, maxLength: 128, annotations: new Dictionary<string, AnnotationValues > {
            {
                "ServiceTableColumn",
                new AnnotationValues(oldValue: null, newValue: "Id")
            },
        }),
    X = c.Int(nullable: false),
    Y = c.Int(nullable: false),
    SubAreaId = c.String(maxLength: 128),
    Version = c.Binary(nullable: false, fixedLength: true,
        timestamp: true, storeType: "rowversion", annotations: new Dictionary <
        string, AnnotationValues > {
            {
                "ServiceTableColumn",
                new AnnotationValues(oldValue: null, newValue:
                    "Version")
            },
        }),
    CreatedAt = c.DateTimeOffset(precision: 7, annotations: new Dictionary <
        string, AnnotationValues > {
            {
                "ServiceTableColumn",
                new AnnotationValues(oldValue: null, newValue:
                    "CreatedAt")
            },
        }),
    UpdatedAt = c.DateTimeOffset(precision: 7, annotations: new Dictionary <
        string, AnnotationValues > {
            {
                "ServiceTableColumn",
                new AnnotationValues(oldValue: null, newValue:
                    "UpdatedAt")
            },
        }),
    Deleted = c.Boolean(nullable: false, annotations: new Dictionary <
        string, AnnotationValues > {
            {
                "ServiceTableColumn",
                new AnnotationValues(oldValue: null, newValue:
                    "Deleted")
            },
        }),
    })
    .PrimaryKey(t => t.Id)
    .ForeignKey("sbp_ct.SubAreas", t => t.SubAreaId)
    .Index(t => t.SubAreaId)
    .Index(t => t.CreatedAt, clustered: true);

我认为从CreatedAt索引中删除clustered:true会起作用,但是PrimaryKey不会成为聚簇索引。 &#34;簇:真&#34;默认情况下为PrimaryKey方法设置但它仍然不会更改任何内容。

如何在代码优先迁移中强制在CreateTable方法上创建主键聚簇索引?

我使用的是EnitityFramework v6.1.1

这是我的模特:

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity.Spatial;
using Microsoft.WindowsAzure.Mobile.Service;
using Newtonsoft.Json;

namespace sbp_ctService.Models
{
    public class Tile : EntityData
    {
        public Tile()
        {
            TestSets = new List<TestSet>();
        }

        [Required(ErrorMessage="X tile coordinate cannot be empty.")]
        public int X { get; set; }

        [Required(ErrorMessage = "Y tile coordinate cannot be empty.")]
        public int Y { get; set; }

        public DbGeometry Geometry { get; set; }

        [Required]
        public string SubAreaId { get; set; }
        [JsonIgnore]
        public virtual SubArea SubArea { get; set; }

        public virtual ICollection<TestSet> TestSets { get; set; }
    }
}

这些类需要从EntityData继承才能与SQL Azure一起使用。他们说要在所有教程中使用它,例如here。它基本上是一个添加ID,CreatedAt,UpdatedAt和Deleted字段的类,可能有助于自动在CreatedAt列上创建聚簇索引。这就是我实际上试图覆盖的内容。

0 个答案:

没有答案