62 messaggi dal 22 ottobre 2012
Utilizzo Entity Framework 6.
Il controllo fwv utilizza dei metodi esterni per la selezione, l'inserimento ....
Nell'esempio sotto la mia tabella ha un campo IDT1 ( identity ), volevo sapere come potevo recuperare l'ID dopo l'inserimento per potere visualizzare in FormViewMode.ReadOnly il record appena inserito.


<asp:FormView ID="fvw1" runat="server" ItemType="Engine.T1"  
SelectMethod="GetT1" InsertMethod="InsertT1" DataKeyNames="IDT1" OnCallingDataMethods="fvw1_CallingDataMethods"


Public Sub InsertT1(context As ModelMethodContext)
  Dim item = New Engine.T1()

   With context
     .TryUpdateModel(item)

      If .ModelState.IsValid Then
        db.T1.Add(item)

         Try
         db.SaveChanges()
         'db.Entry(item).GetDatabaseValues()

         Catch ex As DbUpdateException
           ......
         End Try
      End If
  End With



IDT1 [int] IDENTITY(1,1) NOT NULL

namespace Engine
{
    using System;
    using System.Collections.Generic;
    
    public partial class T1
    {
        public int IDT1 { get; set; }       
        public string descr { get; set; }  
           
    }
}
187 messaggi dal 23 marzo 2006
Come db utilizzi SQL?
Se si puoi utilizzare una store procedure.
Se usi altri db non posso aiutarti.
Fammi sapere
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
subito dopo il SaveChanges, troverai la proprietà item.IDT1 correttamente valorizzata con l'ID del record che è stato appena inserito nel database.
Non devi far nulla; avviene automaticamente.

Leggi qui il paragrafo "Entity Keys and Added Objects".
http://msdn.microsoft.com/en-us/library/vstudio/dd283139(v=vs.100).aspx#sectionSection2

ciao,
Moreno

Enjoy learning and just keep making
62 messaggi dal 22 ottobre 2012
Si avevo visto che dopo il SaveChanges l'item era aggiornata con il valore dell'Identity, ma la mia funzione è su un Assemply dedicato.

Dalla webform tramite la funzione sotto utlizzo dei metodi non statici.

  Protected Sub fvw1_CallingDataMethods(sender As Object, e As CallingDataMethodsEventArgs)
        e.DataMethodsObject = New BLL.WebPortalBL
    End Sub


Dove BLL è progetto libreria di classi contenente la classe WebPortalBLL con i medoti per inserimento, selezione .... di classi.


Come posso recuperare nella mia webform il valore di item aggiornato dopo SaveChanges ?
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

rubinim ha scritto:

Come posso recuperare nella mia webform il valore di item aggiornato dopo SaveChanges ?

Quel valore è in possesso dell'istanza di BLL.WebPortalBL, e perciò sarà essa stessa a doverlo comunicare al mondo esterno.

Per esempio, potresti farle sollevare un evento quando il SaveChanges va a buon fine, e passare l'item come argomento, ora completo del suo nuovo ID.

Dalla Sub fvw1_CallingDataMethods, oltre a creare la nuova istanza di BLL.WebPortalBL, sottoscriverai quell'evento e così riceverai l'item. Usalo per aggiornare la UI.

Questo approccio è simile a quello che trovi nei controlli ASP.NET deputati alla persistenza, come EntityDataSource. Anch'essi infatti dispongono di un evento "Inserted" che ti consente di essere notificato dell'avvenuto inserimento di fare qualcosa con l'entità appena inserita.
http://msdn.microsoft.com/it-it/library/system.web.ui.webcontrols.entitydatasource.inserted(v=vs.110).aspx

ciao,
Moreno
Modificato da BrightSoul il 26 luglio 2014 11.16 -

Enjoy learning and just keep making
62 messaggi dal 22 ottobre 2012
Grazie, avevo pensato anch'io a questa soluzione infatti avevo creato un'apposita classe per gestire il risultato dopo il SaveChanges, ma non ero sicuro fosse la soluzione corretta, per cui ti ringrazio ancora.

Avevo pensato di creare una classe con un ID in modo da controllare eventuali azioni su risultato, in questo caso utilizzavo la stessa classe per il risultato di Insert o Update anche per altri Entity... da diversi metodi.
Controllando ID decodificavo il risultato.

Public Class clsMethodResult
Public ID As String
Public result As Object
End Class

Cosa ne dici ?

db.SaveChanges()

'Raise Event with ID
Dim e As New clsMethodResult
With e
.ID = "Insertxxxx"
.result = item.IDT1
End With
RaiseEvent MethodCompleted(Me, e)
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

rubinim ha scritto:

utilizzavo la stessa classe per il risultato di Insert o Update anche per altri Entity... da diversi metodi.

Sì, hai libera scelta nel tipo di dati che vuoi far emergere dal business layer. Ti suggerivo di lasciar passare l'intera entità nel caso tu avessi altre proprietà, oltre all'ID, che vengono calcolate dal database server. Del resto si tratta di dati che il client stesso ha fornito e che possono risalire tranquillamente dal business layer.
In questo caso potresti creare l'evento del tipo EventHandler(Of TEntità), in modo da non dover comunque creare tante altre classi.

ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.