Come sto aggiornando i dati che sono già presenti nel database e quella tabella ha le colonne come CreatedBy, CreatedDate, ModifiedBy, ModifiedDate . CreatedBy e CreatedDate vengono inseriti quando viene creata la nuova riga, ma durante l'aggiornamento, non è necessario aggiornare CreatedBy e CreatedDate e devo modificare solo ModifiedBy e ModifiedDate.
Come mostrato nel codice seguente, aggiornerà CreatedBy come null e CreatedDate come 01/01/0001 qualcosa come questo.
_Context.UserProfile.Update(userProfile);
e il mio modello è come,
public class MyModelUserProfile
{
public int Id { get; set; }
public string Email { get; set; }
public string Username { get; set; }
public string FirstName { get; set; }
public string CreatedBy { get; set; }
public string ModifiedBy { get; set; }
}
C'è un modo per evitare di aggiornare la colonna CreatedBy e CreatedDate? Posso farlo ottenendo quel particolare record dal suo ID e-mail, ma non voglio colpire il database ancora una volta per questo.
Il modo previsto per EF Core è impostare la proprietà AfterSaveBehavior su un valore diverso da quello predefinito Salva :
Ottiene un valore che indica se questa proprietà può essere modificata o meno dopo il salvataggio dell'entità nel database.
Se Lancia , verrà generata un'eccezione se un nuovo valore viene assegnato a questa proprietà dopo che l'entità esiste nel database.
Se Ignora , qualsiasi modifica al valore della proprietà di un'entità già esistente nel database verrà ignorata.
Non esiste ancora un'API fluente dedicata, quindi è necessario impostarla direttamente tramite metadati di proprietà mutabili in questo modo:
entity.Property(e => e.DateCreated)
.HasDefaultValueSql("(getdate())")
.Metadata.AfterSaveBehavior = PropertySaveBehavior.Throw; // <--
Aggiornamento (EF Core 3.x): a partire da EF Core 3.0, molte proprietà come questa sono state sostituite con coppie di metodi di estensione Get
/ Set
, quindi il codice rilevante ora è il seguente:
.Metadata.SetAfterSaveBehavior(PropertySaveBehavior.Throw);
[Required, DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime DateCreated {get; set;}