21

Sto lavorando su vs 2010 e EF 4.1 con Database server SQL. Il codice riportato di seguito funziona correttamente con il DB del server SQL locale (SQL 2008).Le tabelle senza indice cluster non sono supportate in questa versione di SQL Server

Ma quando ho pubblicato l'applicazione MVC per Windows Azure il cloud e SQL Azure sta dando errore di seguito indicato.

  1. Perché questo errore è soltanto il ritorno SQL Azure (lavorando con desktop del server SQL 2008)?
  2. Come sbarazzarsi di questo?

mio repository esempio di codice metodo come below.Below menzionato errore arriva al momento della chiamata 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 è come di seguito:

{"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 è come di seguito:

{"Tables without a clustered index are not supported in this version of SQL Server. Please create a clustered index and try again."} 

StackTrace è come sotto

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) 

risposta

38

È necessario creare un indice cluster su tutte le tabelle in SQL Azure a cui si desidera aggiungere righe; altrimenti l'istruzione di inserimento fallisce sempre.

CREATE UNIQUE CLUSTERED INDEX Idx_TableName ON TableName(yourGUIDColumn);

Ecco un riferimento alle linee guida generali e limitazioni specificamente per quanto riguarda questi indici: MSDN Link

Ecco un altro articolo che spiega le motivazioni alla base di questo: link

+4

Thanks.When creo un key.Its primarie di lavoro. ALTER TABLE [dbo]. [RetailSaleReturns] ADD PRIMARY KEY ([Id]) – Sampath

+2

Inoltre, una cosa da tenere a mente, non è possibile rilasciare un indice su un tavolo senza lasciare indici. –

4

ho trovato più facile aggiornamento alla v12.

ho dovuto BACKUP (coz io sono intelligente come quello!), Quindi aggiornare tutti i miei DB (utilizzando la vecchia console manage.windowszaure.com) dal Web a livello di base. Poi seguire le istruzioni qui di aggiornare (https://azure.microsoft.com/en-us/documentation/articles/sql-database-v12-upgrade/)

In poche parole:

  • Aprire portal.azure.com
  • Selezionare SQLServer
  • Operations
  • Ultimo aggiornamento database SQL

per monitorare i progressi utilizzando PowerShell azzurro:

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