web-dev-qa-db-ja.com

このバージョンのSQLServerでは、クラスター化されたインデックスのないテーブルはサポートされていません。

私はvs2010およびEF4.1 with SQLサーバーデータベースに取り組んでいます。以下のコードは、ローカルSQLサーバーDB(SQL 2008)で正常に機能します。

しかし、windows Azure cloudおよびSQL AzureのMVCアプリケーションを公開したとき、下記のエラーが表示されます。

  1. なぜこのエラーはSQL Azureのみを返す(デスクトップSQLサーバー2008で動作する)ですか?
  2. これを取り除く方法は?

私のリポジトリコードサンプル以下のとおり。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)
21
Sampath

行を追加するSQL Azureのすべてのテーブルにクラスター化されたインデックスを作成する必要があります。そうでない場合、挿入ステートメントは常に失敗します。

CREATE UNIQUE CLUSTERED INDEX Idx_TableName ON TableName(yourGUIDColumn);

以下は、これらのインデックスに関する具体的な一般的なガイドラインと制限への参照です。 MSDN Link

これの背後にある理由を説明する別の記事があります: link

38
cillierscharl

V12にアップグレードする方が簡単だと思いました。

私はバックアップし(私はそのように賢いです!)、次にすべてのDBを(古いコンソールmanage.windowszaure.comを使用して)Webから基本層にアップグレードする必要がありました。次に、こちらの手順に従ってアップグレードします( https://Azure.Microsoft.com/en-us/documentation/articles/sql-database-v12-upgrade/

簡単に言えば:

  • Portal.Azure.comを開きます。
  • Sqlserverを選択します
  • オペレーション
  • 最新のSQLデータベースの更新

Azure PowerShellを使用して進行状況を監視するには:

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