C# 在移动服务数据库上启用代码优先迁移时出错
我最近创建了一个Azure移动服务项目(C#后端),并将其连接到Azure SQL数据库。我一直在尝试在备份数据库上启用代码优先迁移,但当我尝试更新数据库时,它会抛出错误 我完成了启用迁移的所有常规步骤(启用迁移、添加迁移)。但当我尝试更新数据库时,它返回以下错误: 无法在表“dbo.appoints”上创建多个聚集索引。在创建另一个聚集索引之前,请删除现有的聚集索引“PK_dbo.appoints”C# 在移动服务数据库上启用代码优先迁移时出错,c#,sql,entity-framework,ef-code-first,azure-sql-database,C#,Sql,Entity Framework,Ef Code First,Azure Sql Database,我最近创建了一个Azure移动服务项目(C#后端),并将其连接到Azure SQL数据库。我一直在尝试在备份数据库上启用代码优先迁移,但当我尝试更新数据库时,它会抛出错误 我完成了启用迁移的所有常规步骤(启用迁移、添加迁移)。但当我尝试更新数据库时,它返回以下错误: 无法在表“dbo.appoints”上创建多个聚集索引。在创建另一个聚集索引之前,请删除现有的聚集索引“PK_dbo.appoints” 为什么会这样?我的数据库中没有任何表,项目几乎是默认的。我也遇到了同样的问题 这是由我们的基类
为什么会这样?我的数据库中没有任何表,项目几乎是默认的。我也遇到了同样的问题 这是由我们的基类EntityData的定义引起的:
public class OrgTest : EntityData
{
public string Prop1 { get; set; }
}
我用自己的实现“CustomEntity”替换了EntityData,其中删除了CreatedAt列上的属性[Index(IsClustered=true)]:
public abstract class CustomEntity : ITableData
{
// protected CustomEntity();
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[TableColumn(TableColumnType.CreatedAt)]
public DateTimeOffset? CreatedAt { get; set; }
[TableColumn(TableColumnType.Deleted)]
public bool Deleted { get; set; }
[Key]
[TableColumn(TableColumnType.Id)]
public string Id { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[TableColumn(TableColumnType.UpdatedAt)]
public DateTimeOffset? UpdatedAt { get; set; }
[TableColumn(TableColumnType.Version)]
[Timestamp]
public byte[] Version { get; set; }
}
现在我继承了这个:
public class OrgTest : CustomEntity // EntityData
{
public string Prop1 { get; set; }
}
也许我会有麻烦进一步,但目前我可以创建我的模型!
希望你也能这样开始 我今天和这个问题斗争了几个小时。直到我找到这个链接: 如果你按照那里的说明去做,它肯定会成功的。最重要的是,当您在本地调试会话中点击F5时,迁移将发生。请参阅本文:
EntityData为CreateAt定义一个群集索引,默认情况下Id是一个群集索引,这样它会提供一个错误,您应该只定义一个。如果您在创建迁移类后在更新数据库中遇到此错误,请查看您的迁移类。迁移类将采用主is聚集索引。所以从up()方法中删除它 .PrimaryKey(t=>t.Id,集群:false) .Index(t=>t.CreatedAt,聚集:true)强> 如果您在azure移动服务上使用它,请不要手动调用“更新数据库”。
请参阅关于从自定义实体类派生的几个答案将起作用,但它们不是理想的解决方案。正如EF团队(和其他人)所提到的,您只需将这一行添加到您的上下文配置构造函数中
SetSqlGenerator("System.Data.SqlClient", new EntityTableSqlGenerator());
这将删除您在创建迁移时的错误,并允许您通过powershell命令更新数据库。我最终只是使用了一个Web API项目。这可能是正确的答案,但我无法确认解决方案。它根据我之前发布的教程工作。但是,在发布之前在本地(F5)运行项目、在WebApiConig类中进行更改(如本教程第6点所述)以及启用自动迁移(迁移文件夹中的配置类)非常重要。由于我使用此工作流,我没有任何进一步的问题,只有一次数据库访问权限设置不正确。但现在这似乎也得到了解决。我遇到了一个问题,当我尝试使用此CustomEntity向表中插入一行时,出现了以下错误:
操作失败,出现以下错误:“无法将值NULL插入列'CreatedAt'
您有什么解决方案吗?现在我有这样的错误,这是正确的答案。当我尝试下面的答案时,当我查询它时,客户端总是抛出“坏请求”错误,即使我可以使用Fiddler下拉数据。因此,我放弃了从EntityData继承的数据库,然后使用自动迁移来创建表。它工作!!!链接似乎已移动。请注意,引用的文章以文本开头:默认初始值设定项已有所更改,因为.NET后端已达到“通用性”里程碑。您可以在中找到最新信息,这是中引用的文章。此解决方案对我有效。在这个错误突然发生之前,我已经多次将这个应用程序部署到服务器上,并删除了所有要重新启动的表。因此,添加这一行并再次重新部署效果很好——在这之后,我的所有表都被重新创建了。谢谢。这将放在您的“Configuration.cs”文件中。内部密封类配置:dbmigtorysconfiguration{public Configuration(){automaticmmigtorysenabled=true;SetSqlGenerator(“System.Data.SqlClient”,new EntityTableSqlGenerator());}这不再链接到任何有用的内容。已尝试在azure页面上搜索,但没有任何乐趣。。。