2009-12-22 16 views
7

Ho 2 tabelle, Table1 ha una chiave primaria 'CustomizationId', e Table2 ha un Customizationid FK che corrisponde a questo. Table2 non ha chiave primaria.Come si aggiorna una tabella con una chiave esterna a un'altra tabella in ADO.Net Entity Model?

Sto tentando di aggiungere un nuovo record da un modulo basato sul web. Tento di salvare questo alla base di dati ed ottengo un errore:

  Customization customization = new Customization(); 
      Code code = new Code(); 
      customization.Name = CustomizationName.Text;    
      customization.LastUpdated = DateTime.Now; 

      code.Top = top_js.InnerText; 
      code.Bottom = bottom_js.InnerText; 

      //code.CustomizationId = customization.CustomizationId; 

      customization.Code = code;    
      entities.AddToCustomizations(customization); 
      entities.SaveChanges(); 

Quando chiamo SaveChanges sto ottenendo un errore, anche se non aggiungo nella linea commentata.

Unable to update the EntitySet 'Code' because it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionMapping> element to support the current operation. 

Come posso gestire questa situazione? Voglio solo aggiungere il codice nello stesso momento in cui aggiungo la personalizzazione. La tabella 'Codice' dovrebbe avere il Customizationid impostato su PK/Identity impostato dalla personalizzazione.

Qualche idea?

risposta

7

Per quanto riguarda l'EF, la tabella senza PK è una vista.

Questo significa che hai due opzioni:

  1. raccontare una piccola bugia bianca, e convincere la EF che il 'view' is a table
  2. Add modification functions (Insert/Update/Delete) in modo da poterli modificare.

Generalmente le funzioni di modifica sono memorizzati procedure, ma si può effettivamente aggiungere T-SQL direttamente al SSDL se non si ha accesso al database ...

Vale a dire qualcosa di simile nell'elemento <StorageModel> del EDMX per ogni azione (inserimento, aggiornamento e cancellazione):

<Function Name="InsertCode" BuiltIn="false" IsComposable="false" > 
     <CommandText> 
       INSERT dbo.TCode(ID, Name) VALUES (@ID, @Name) 
     </CommandText> 
     <Parameter Name="ID" Type="int" Mode="In" /> 
     <Parameter Name="ID" Type="nvarchar(max)" Mode="In" /> 
</Function> 

Una volta che si hanno le funzioni di modifica nel vostro SSDL è necessario map them in modo che l'EF li usa come richiesto.

Nella vostra situazione raccomando (1).

Spero che questo aiuti.

Cheers Alex

Problemi correlati