我尝试将空间列添加到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列上创建聚簇索引。这就是我实际上试图覆盖的内容。