Domanda

Im usando EF4 in VS2010, POCO di e l'approccio Model-First.

Il mio ente ha le seguenti proprietà: Id: GUID, il nome: String, Creato: DateTime, Modificato: DateTime, Revisione:. Int32

Creo il mio soggetto, impostare il nome e salvarlo al database utilizzando l'EF4 al contesto. Questo dovrebbe impostare Id per un nuovo GUID (opere con Identity-PSC), insieme Creato per ora, modificato lasciato come null, insieme Revisione a 0. Ho recuperare l'entità, cambiare il nome e salvarlo nuovamente. Questa volta il valore modificato deve essere impostato su ora e revisione dovrebbe essere 1.

Come faccio a meglio realizzare questo utilizzando EF4 con l'EDMX-designer?

Aggiornamento:

Questo è stato quello che ho finito per usare:

public override int SaveChanges(System.Data.Objects.SaveOptions options)
{
    foreach (ObjectStateEntry entry in ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified).Where(e => e.Entity is EntityBase))
    {
        EntityBase entity = entry.Entity as EntityBase;
        if (entry.State == EntityState.Added)
        {
            entity.Version = new Version() { Major = 1, Minor = 0, Revision = 0 };
            entity.Created = DateTime.Now;
            if (OperationContext.Current != null) entity.CreatedBy = OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name;
        }
        else if (entry.State == EntityState.Modified)
        {
            entity.Version.Revision++;
            entity.Modified = DateTime.Now;
            if (OperationContext.Current != null) entity.ModifiedBy = OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name;
        }
    }

    return base.SaveChanges(options);
}

Quale lavoro isnt ...: (

Il problema è che l'entry.State ancora non modificato anche se in modo esplicito eseguito il MarkAsModified () - metodo. Non ottengo questo ...

Perché isnt il rilevamento delle modifiche abilitato di default? Im utilizzando entità auto-monitoraggio e allora perché dovrei voler fuori ed esplicitamente accenderlo ogni volta? E perché le entità persistevano al db, anche se lo stato non è stato modificato? E che cosa è la differenza tra EntityState e ObjectState? Al momento Im fare tutte le modifiche e gli aggiornamenti serverside ma sarà anche possibile utilizzare un WCF-service a entità di trasferimento avanti e indietro qualche tempo dopo ... C'è una differenza nel modo in cui i cambiamenti sono trattati qui? Se serverside tutte le modifiche, non importa changetracking on / off, viene mantenuto ?? Quello che voglio è che nulla deve mai essere in grado di essere memorizzati anche senza l'aggiornamento Modified, revisione ecc Queste proprietà devono sempre essere impostate sul server quando l'oggetto è ricevuto indietro ed è cambiato. (Non sto parlando sql-server-side qui ma il servizio-lato server)

È stato utile?

Soluzione

Supponiamo che il nome Tipo di entità è prodotto:

partial void OnContextCreated() {
    this.SavingChanges += Context_SavingChanges;
}

void Context_SavingChanges(object sender, EventArgs e) {

    IEnumerable objectStateEntries =
            from ose
            in this.ObjectStateManager.GetObjectStateEntries(EntityState.Added | 
                                                            EntityState.Modified)
            where ose.Entity is Product
            select ose;

    Product product = objectStateEntries.Single().Entity as Product;

    product.ModifiedDate = DateTime.Now;
    product.ComplexProperty.Revision++;
}


Se siete alla ricerca per utilizzare questo codice per popolare campo comune, come ModifiedDate o ModifiedBy per tutti i soggetti quindi si prega di dare un'occhiata a questo post:
Entity Framework - Revisione attività
Tra l'altro, StoreGeneratedPattern e ConcurrencyMode non ha nulla a che fare con questo, sono lì per cose completamente diverse e non correlate.

Altri suggerimenti

Io ho un debole per una soluzione basata sul codice lato client, personalmente. Dal momento che si sta utilizzando pocos, sarebbe probabilmente più semplice per avere l'oggetto stesso fare l'aggiornamento. Aggiornare l'accesso set sulla proprietà Nome di chiamare un metodo "objectModified" che cambia le proprietà modificate e di revisione.

Se questo è sgradevole a causa della differenza di tempo tra il momento la proprietà è cambiata e il tempo l'oggetto viene salvato, è possibile sfruttare il classe parziale sul vostro oggetto Entità. Questo consentirà di sovrascrivere il metodo SaveChanges dove è possibile toccare le entités nella loro proprietà ObjectSet sull'oggetto Entità. Qualcosa di simile:

public partial class YourEntities
{
    public override int SaveChanges(System.Data.Objects.SaveOptions options)
    {
        //update your objects here
        return base.SaveChanges(options);
    }
}

Possiamo usare parziale metodo SaveChanges di classe e di override per raggiungere questo obiettivo.

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Core.Objects;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;


namespace TestDatamodel
{
    public partial class DiagnosisPrescriptionManagementEntities
    {
        public override int SaveChanges()
        {
            ObjectContext context = ((IObjectContextAdapter)this).ObjectContext;

            foreach (ObjectStateEntry entry in
                     (context.ObjectStateManager
                       .GetObjectStateEntries(EntityState.Added | EntityState.Modified)))
            {                    
                if (!entry.IsRelationship)
                {
                    CurrentValueRecord entryValues = entry.CurrentValues;
                    if (entryValues.GetOrdinal("ModifiedBy") > 0)
                    {
                        HttpContext currentContext = HttpContext.Current;
                        string userId = "nazrul";
                        DateTime now = DateTime.Now;

                        if (currContext.User.Identity.IsAuthenticated)
                        {
                            if (currentContext .Session["userId"] != null)
                            {
                                userId = (string)currentContext .Session["userId"];
                            }
                            else
                            {                                    
                                userId = UserAuthentication.GetUserId(currentContext .User.Identity.UserCode);
                            }
                        }

                        if (entry.State == EntityState.Modified)
                        {
                           entryValues.SetString(entryValues.GetOrdinal("ModifiedBy"), userId);
                           entryValues.SetDateTime(entryValues.GetOrdinal("ModifiedDate"), now);
                        }

                        if (entry.State == EntityState.Added)
                        {
                            entryValues.SetString(entryValues.GetOrdinal("CreatedBy"), userId);
                            entryValues.SetDateTime(entryValues.GetOrdinal("CreatedDate"), now);
                        }
                    }
                }
            }

            return base.SaveChanges();
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top