Cum să verificați dacă DbContext.Set există <T> în model?

Am o situație în care pot lucra cu mai multe contexte DbContext care pot sau nu să conțină un DbSet of SomeEntity.

Firește, dacă declanșez SaveChanges și această entitate nu este prezentă, se va produce următoarea eroare:

Tipul entității SomeEntity nu face parte din modelul curent   context.

Cum pot verifica dacă setul entității sau entității există într-un model și scurtcircuitarea bițiului de cod în cazul în care nu se întâmplă?

Richard

5

3 răspunsuri

The exception should be thrown immediately when you call Set so the simplest way is to catch the exception and handle it as you need.

Soluția complexă vă cere să căutați metadate de cartografiere și să căutați tipul entității mapate, care trebuie să aibă același nume ca tipul CLR. Puteți adăuga această metodă în clasa de context derivată pentru a verifica existența tipului de entitate:

public bool Exists() where TEntity : class
{
    string entityName = typeof(TEntity).Name;
    ObjectContext objContext = ((IObjectContextAdapter)this).ObjectContext;
    MetadataWorkspace workspace = objContext.MetadataWorkspace;
    return workspace.GetItems(DataSpace.CSpace).Any(e => e.Name == entityName);
}
10
adăugat
Mulțumesc. Am folosit metoda oferită. Sunt mereu inconfortabil folosind excepții în locuri unde știu că există o excepție. Dacă acest lucru are sens.
adăugat autor Richard, sursa
Este încă adevărat, patru ani mai târziu? Sau există o metodă integrată pentru a verifica acest lucru?
adăugat autor Zev Spitz, sursa

Am folosit frecvent după implementare.

(Am declarat această metodă într-o interfață separată, care este implementată de clasa context).

public bool EntitySetExists(T entity) where T : class
{
    return this.Set().Local.Any(e => e == entity);
}

Dacă în cazul în care îl vedeți plângându-se despre "Any ()" metoda de extensie pur și simplu stick în "folosind System.Linq;" dacă lipsesc.

2
adăugat
Pentru a-mi clarifica scăderea, aceasta răspunde la întrebarea greșită; răspunsul acceptat este corect
adăugat autor AlexFoxGill, sursa

Acesta este răspunsul meu simplificat:

public partial class MyDbContext : DbContext
{
   public bool Exists() where Tx : class
   {
       var attachedEntity = this.ChangeTracker.Entries().FirstOrDefault();
       return (attachedEntity != null);
   }
}
0
adăugat