Mi piace il fatto che AddOrUpdate consenta di specificare un filtro da verificare per evitare l'aggiunta di duplicati. Ma vorrei funzionalità simili senza l'aggiornamento.Entity Framework Aggiungi se non esiste senza aggiornamento
In questo momento mi fare qualcosa di simile:
var checkProfile = from p in db.Profile
where p => p.LastName == newProfile.lastName
&& p => p.FirstName == newProfile.firstName
&& p => p.Middle== newProfile.middle
select p;
if (checkProfile.FirstOrDefault() == null)
{
db.Profile.Add(newProfile);
db.SaveChanges();
}
so di poter fare qualcosa di simile:
db.Profile.AddOrUpdate(p => new {p.LastName, p.FirstName, p.Middle}, newProfile);
db.SaveChanges();
Ma avrei preferito saltare la modifica dei dati in questo caso.
Il primo esempio fa quello che voglio ma con più codice. C'è un modo più semplice/più pulito di fare ciò che voglio nel primo esempio?
Aggiornamento:
Mi piace il suggerimento di Ognyan Dimitrov. Sto cercando di implementarlo. I miei modelli ereditano da BaseEntity. Posso inserire una versione generica di quello lì?
Il mio modello è definito:
public class Address :BaseEntity
{
mio BaseEntity:
public class BaseEntity
{
public virtual T AddIfNotExists<T>(T entity, Expression<Func<T, bool>> predicate = null)
{
var exists = predicate != null ? DbSet.Any(predicate) : DbSet.Any();
return !exists ? DbSet.Add(entity) : null;
}
}
che sto ricevendo errori per qualsiasi (...) e aggiungere (...). L'errore per Aggiungi (...) è 'Un riferimento a un oggetto è richiesto per il campo, metodo o proprietà non statici' System.Data.Entity.DbSet.Add (oggetto) ''
Devo utilizzare this.Add (oggetto)?
Aggiornamento 2:
Ho creato questo codice:
public static class DbSetExtensions
{
public static T AddIfNotExists<T>(this DbSet<T> dbSet, T entity, Expression<Func<T, bool>> predicate = null) where T : class, new()
{
var exists = predicate != null ? dbSet.Any(predicate) : dbSet.Any();
return !exists ? dbSet.Add(entity) : null;
}
}
Ora sto cercando di chiamare in questo modo, ma non è corretto. Perdona la mia mancanza di comprensione.
_db.ProfileIdentifier.AddIfNotExists(newIdentifier,
pi => new {pi.ProfileId, pi.ProfileIdentifierTypeId, pi.ProfileIdentifierValue});
Aggiornamento - Soluzione:
posso chiamare i DbSetextensions come questo:
_db.ProfileIdentifier.AddIfNotExists(newIdentifier,
pi => pi.ProfileId == profileId &&
pi.ProfileIdentifierTypeId == (int)type &&
pi.ProfileIdentifierValue == value);
Grazie mille per lavorare con me Ognyan !!!
Non penso che ci sia - puoi scrivere una stored procedure che farà un 'MERGE', ma non credo che ci sia qualcosa di integrato. –
l'unico modo in cui posso pensare è quello che stai facendo adesso – user1666620
Take cura con il metodo 'AddOrUpdate': http://thedatafarm.com/data-access/take-care-with-ef-4-3-addorupdate-method/ – Colin