我正在使用 SQL服务器数据库开展 vs 2010和EF 4.1 。 下面提到的代码适用于本地SQL Server DB。(SQL 2008)。
但是,当我发布 windows AZURE云和 SQL Azure 的MVC应用程序时,它会给出下面提到的错误。
我的存储库代码示例如下所示。下面提到错误来自调用时 Catalog.SaveChanges()方法。
using (var catalog = new DataCatalog())
{
var retailSaleReturn = new RetailSaleReturn
{
ReturnQuantity = returnQuantity,
Product = saleDetailObj.Product,
Owner = owner,
Provider = provider,
};
//add to context
Catalog.RetailSaleReturns.Add(retailSaleReturn);
//save for db
Catalog.SaveChanges();
}
DbUpdateException 如下所示:
{"An error occurred while saving entities that do not expose foreign key properties for their relationships. The EntityEntries property will return null because a single entity cannot be identified as the source of the exception. Handling of exceptions while saving can be made easier by exposing foreign key properties in your entity types. See the InnerException for details."}
InnerException 如下所示:
{"Tables without a clustered index are not supported in this version of SQL Server. Please create a clustered index and try again."}
StackTrace 如下所示
at System.Data.Entity.Internal.InternalContext.SaveChanges()
at PawLoyalty.Data.Repositories.CustomersRepository.ReturnRetailOnlySales(Guid saleDetailId, Int32 returnQuantity, String providerKey, String ownerKey) in D:\PawLoyalty Module\PawLoyalty\PawLoyalty\PawLoyalty.Data\Repositories\CustomersRepository.cs:line 550
at PawLoyalty.Web.Areas.Providers.Controllers.CustomersController.ReturnRetailOnlySales(String providerKey, String ownerKey, String petKey, Guid saleDetailId, Int32 returnQuantity) in D:\PawLoyalty Module\PawLoyalty\PawLoyalty\PawLoyalty.Web\Areas\Providers\Controllers\CustomersController.cs:line 942
at lambda_method(Closure , ControllerBase , Object[] )
at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
答案 0 :(得分:38)
您需要在 SQL Azure 中要为其添加行的所有表上创建聚簇索引;否则insert语句总是失败。
CREATE UNIQUE CLUSTERED INDEX Idx_TableName ON TableName(yourGUIDColumn);
以下是对这些索引的一般准则和限制的引用:MSDN Link
这是另一篇解释其背后原因的文章:link
答案 1 :(得分:4)
我发现升级到v12更容易。
我不得不备份(因为我很聪明!),然后将我的所有数据库(使用旧控制台manage.windowszaure.com)从Web升级到Basic层。然后按照此处的说明升级(https://azure.microsoft.com/en-us/documentation/articles/sql-database-v12-upgrade/)
简单地说:
使用azure powershell监控进度:
Add-AzureAccount
Switch-AzureMode -Name AzureResourceManager
Get-AzureSqlServer -ServerName '<<yoursqlservername>>' -ResourceGroupName '<<sqlserverresourcegroupname>>'