webentwicklung-frage-antwort-db.com.de

Warum implementiert DbContext keine IDbContext-Schnittstelle?

Warum gibt es im Entity Framework keine IDbContext -Schnittstelle? Wäre es nicht einfacher, Dinge zu testen, wenn es eine vorhandene Schnittstelle mit Methoden wie SaveChanges () usw. gäbe, von der Sie Ihre benutzerdefinierte Datenbankkontextschnittstelle ableiten könnten?

public interface ICustomDbContext : IDbContext
{
    // add entity set properties to existing set of methods in IDbContext
    IDbSet<SomeEntity> SomeEntities { get; }
}
52
Grief Coder

Ich sehe dieses IDbContext:

Siehe diesen Link Und dann erstellen Sie eine neue Teilklasse für Ihren Entitätskontext mit dieser Schnittstelle.

public partial class YourModelEntities : DbContext, IDbContext 

BEARBEITET: Ich habe diesen Beitrag bearbeitet, das funktioniert für mich. Mein Kontext

namespace dao
{
    public interface ContextI : IDisposable
    {
        DbSet<TEntity> Set<TEntity>() where TEntity : class;
        DbSet Set(Type entityType);
        int SaveChanges();
        IEnumerable<DbEntityValidationResult> GetValidationErrors();
        DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity:class;
        DbEntityEntry Entry(object entity);
        string ConnectionString { get; set; }
        bool AutoDetectChangedEnabled { get; set; }
        void ExecuteSqlCommand(string p, params object[] o);
        void ExecuteSqlCommand(string p);
    }
}

YourModelEntities ist Ihre automatisch generierte Teilklasse, und Sie müssen eine neue Teilklasse mit demselben Namen erstellen und dann Ihre neue Kontextschnittstelle hinzufügen. In diesem Beispiel ist dies ContextI

HINWEIS: Die Schnittstelle implementiert nicht alle Methoden, da die Methoden in Ihrem automatisch generierten Code implementiert sind.

namespace dao
{
    public partial class YourModelEntities :DbContext, ContextI
    {
        public string ConnectionString
        {
            get
            {
                return this.Database.Connection.ConnectionString;
            }
            set
            {
                this.Database.Connection.ConnectionString = value;
            }
        }

        bool AutoDetectChangedEnabled
        {
            get
            {
                return true;
            }
            set
            {
                throw new NotImplementedException();
            }
        }

        public void ExecuteSqlCommand(string p,params object[] os)
        {
            this.Database.ExecuteSqlCommand(p, os);
        }

        public void ExecuteSqlCommand(string p)
        {
            this.Database.ExecuteSqlCommand(p);
        }

        bool ContextI.AutoDetectChangedEnabled
        {
            get
            {
                return this.Configuration.AutoDetectChangesEnabled;
            }
            set
            {
                this.Configuration.AutoDetectChangesEnabled = value;
            }
        }

    }
}
14
user1626116

Ich habe auch darüber nachgedacht, ich gehe davon aus, dass Sie es für spöttischDbContext verwenden werden. Ich finde keinen Grund dafür, außer dass Sie Ihr eigenes DbSet manuell in Ihr ohnehin für Ihre verspottete Klasse implementieren müssen (Sie müssen also trotzdem Ihr eigenes Interface umschreiben).

0

Erstellen Sie einfach einen nachgebildeten DbContext, der Ihren Produktions-DbContext erweitert und die Methoden überschreibt, die das Testen erschweren. Auf diese Weise werden alle Änderungen am Produktions-DbContext automatisch in die Tests übernommen, mit Ausnahme der überschriebenen Methoden. Für alle anderen Klassen, die sich mit Persistenz befassen und den DbContext verwenden, erweitern Sie diese einfach, indem Sie den erweiterten Schein-DbContext übergeben.

namespace Test.Mocks
{  
    public sealed class MockDatabaseContext : MainProject.Persistence.Database.DatabaseContext
    {
        public MockDatabaseContext(ConfigurationWrapper config) : base(config)
        {

        }      
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {

            var dbPath = "test.db";
            optionsBuilder.UseSqlite($"Filename={dbPath}");


        }
    }
}

namespace Test.Mocks
{

    public class MockInventoryFacade : InventoryFacade
    {        
        public MockInventoryFacade(MockDatabaseContext databaseContext) : base(databaseContext)
        {

        }    
    }
}
0
Sean Anderson