Подтвердить что ты не робот

Таблицы без кластерного индекса не поддерживаются в этой версии SQL Server

Я работаю над vs 2010 и EF 4.1 с базой данных SQL. Ниже упомянутый код отлично работает с локальным DB сервера SQL (SQL 2008).

Но когда я опубликовал приложение MVC для окон облака AZURE и SQL Azure, это дало ниже упомянутую ошибку.

  • Почему эта ошибка возвращает SQL Azure (работает с настольным SQL Server 2008)?
  • Как избавиться от этого?

Мой репозиторий пример кода, как показано ниже. Указанная ошибка возникает при вызове   Каталог .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)
4b9b3361

Ответ 1

Вам нужно создать кластерный индекс для всех таблиц в SQL Azure, в который вы хотите добавить строки; в противном случае инструкция insert всегда терпит неудачу.

CREATE UNIQUE CLUSTERED INDEX Idx_TableName ON TableName(yourGUIDColumn);

Вот ссылка на общие рекомендации и ограничения, конкретно касающиеся этих индексов: Ссылка MSDN

Вот еще одна статья, в которой объясняются причины этого: ссылка

Ответ 2

Мне стало проще обновить до v12.

Мне нужно было BACKUP (потому что я такой умный!), а затем обновить всю мою БД (используя старую консоль manage.windowszaure.com) от Web до Basic level. Затем следуйте инструкциям для обновления (https://azure.microsoft.com/en-us/documentation/articles/sql-database-v12-upgrade/)

Проще говоря:

  • Откройте портал portal.azure.com
  • Выберите Sqlserver
  • Операции
  • Последнее обновление базы данных SQL

Следить за прогрессом, используя лазейку powershell:

Add-AzureAccount
Switch-AzureMode -Name AzureResourceManager
Get-AzureSqlServer -ServerName '<<yoursqlservername>>' -ResourceGroupName '<<sqlserverresourcegroupname>>'