Il modello di aggiornamento fa sì che l'interfaccia venga rimossa da DbContext quando si utilizza Effort con Entity Framework

c# effort entity-framework-6 unit-testing

Domanda

Attualmente sto tentando di utilizzare Effort ( https://effort.codeplex.com/ ) con la mia soluzione Entity Framework 6 per consentire il test delle unità senza richiedere una connessione al database (vedere http://www.codeproject.com/Articles/460175 / Two-strategies-for-testing-Entity-Framework-Effort ). Tutto funziona nel mio progetto, dove questo è il DbContext con un'interfaccia e i costruttori sovraccaricati richiesti per lo sforzo:

namespace Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
    using System;
    using System.Data.Common;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;

    public partial class HRADDbContext : DbContext, IHRADDbContext
    {
        public HRADDbContext() : base("name=HRADDbContext")
        {
        }        

        public HRADDbContext(string nameOrConnectionString)
            : base(nameOrConnectionString)
        {
            this.Configuration.LazyLoadingEnabled = false;
        }

        public HRADDbContext(DbConnection connection)
            : base(connection, true)
        {
            this.Configuration.LazyLoadingEnabled = false;
        }

        public virtual DbSet<CCS_DEPT_TBL> CCS_DEPT_TBL { get; set; }
        public virtual DbSet<CCS_HR_AD_SYNC> CCS_HR_AD_SYNC { get; set; }
    }
}

Il problema è che, se .edmx file .edmx scegliendo "Aggiorna modello dal database ...", si rigenera il file di contesto in modo che sia:

namespace Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
    using System;
    using System.Data.Common;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;

    public partial class HRADDbContext : DbContext, IHRADDbContext
    {
        public HRADDbContext() : base("name=HRADDbContext")
        {
        }        

        public HRADDbContext(string nameOrConnectionString)
            : base(nameOrConnectionString)
        {
            this.Configuration.LazyLoadingEnabled = false;
        }

        public HRADDbContext(DbConnection connection)
            : base(connection, true)
        {
            this.Configuration.LazyLoadingEnabled = false;
        }

        public virtual DbSet<CCS_DEPT_TBL> CCS_DEPT_TBL { get; set; }
        public virtual DbSet<CCS_HR_AD_SYNC> CCS_HR_AD_SYNC { get; set; }
    }
}

Quindi devo tornare indietro e aggiornare manualmente il file Context.cs sopra ogni volta. Inoltre, rimuove la [Key] dal file POCO CCS_DEPT_TBL .

C'è un modo per impostare il mio progetto Entity Framework in modo che non distrugga l'interfaccia e costruttori sovraccaricati ogni volta che aggiorno il modello dal database? TIA.

AGGIORNARE:

Poiché la classe è parziale, mi limito a garantire che l'interfaccia e i costruttori sovraccaricati vengano inseriti in un file separato che non viene generato automaticamente.

AGGIORNAMENTO 2:

OK, ricevuto, appena aggiunto questo come un file separato, prendendo la DEPTID fuori dell'originale POCO file, ma mette ancora che DEPTID nel file generato, così dopo un aggiornamento le pause di build, perché ci sono due DEPTID valori nella stessa classe:

namespace Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
    using System;
    using System.Data.Common;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;

    public partial class HRADDbContext : DbContext, IHRADDbContext
    {
        public HRADDbContext() : base("name=HRADDbContext")
        {
        }        

        public HRADDbContext(string nameOrConnectionString)
            : base(nameOrConnectionString)
        {
            this.Configuration.LazyLoadingEnabled = false;
        }

        public HRADDbContext(DbConnection connection)
            : base(connection, true)
        {
            this.Configuration.LazyLoadingEnabled = false;
        }

        public virtual DbSet<CCS_DEPT_TBL> CCS_DEPT_TBL { get; set; }
        public virtual DbSet<CCS_HR_AD_SYNC> CCS_HR_AD_SYNC { get; set; }
    }
}

Quindi, come posso evitare che generi DEPTID nel file di classe generato, poiché è già nel file di classe parziale sopra?

Risposta accettata

Sì, la classe è definita come una classe parziale. Crea un nuovo file che dichiari anche la stessa classe parziale e aggiungi qui i tuoi metodi aggiuntivi.

Per quanto riguarda l'attributo [Key] perso, puoi provare a utilizzare un attributo MetadataType e inserire tutti i tuoi metadati.

namespace Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;

    [MetadataType(typeof(CCS_DEPT_TBL_Meta))]
    public partial class CCS_DEPT_TBL
    {
      ... Your additional constructors and methods here ...
    }
    public class CCS_DEPT_TBL_Meta
    {
        [Key]
        public string DEPTID { get; set; }    
    }
}

Risposta popolare

Grazie @Robert McKee! Ecco cosa ho finito per fare:

CCS_DEPT_TBL_Key.cs:

namespace Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;

    [MetadataType(typeof(CCS_DEPT_TBL_Meta))]
    public partial class CCS_DEPT_TBL
    {

    }
    public class CCS_DEPT_TBL_Meta
    {
        [Key]
        public string DEPTID { get; set; }    
    }
}

CCS_DEPT_TBL.cs:

namespace Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;

    [MetadataType(typeof(CCS_DEPT_TBL_Meta))]
    public partial class CCS_DEPT_TBL
    {

    }
    public class CCS_DEPT_TBL_Meta
    {
        [Key]
        public string DEPTID { get; set; }    
    }
}

HRModel.Context.cs: HRADDbContext è in realtà entità database-first, ma ci sono altri tre file * .edmx che sono entità code-first nello stesso progetto, quindi ha commentato questa eccezione in HRModel.Context.cs perché non lo fa. t applicare. Probabilmente sarebbe meglio separare le prime entità del database in un progetto separato, quindi questa eccezione non verrebbe generata su un aggiornamento del modello di database.

namespace Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;

    [MetadataType(typeof(CCS_DEPT_TBL_Meta))]
    public partial class CCS_DEPT_TBL
    {

    }
    public class CCS_DEPT_TBL_Meta
    {
        [Key]
        public string DEPTID { get; set; }    
    }
}

HRADDbContext.cs, dove l'interfaccia IHRADDbContext è necessaria per lo sforzo:

namespace Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;

    [MetadataType(typeof(CCS_DEPT_TBL_Meta))]
    public partial class CCS_DEPT_TBL
    {

    }
    public class CCS_DEPT_TBL_Meta
    {
        [Key]
        public string DEPTID { get; set; }    
    }
}



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché