El modelo de actualización hace que la interfaz se elimine de DbContext cuando se usa Effort con Entity Framework

c# effort entity-framework-6 unit-testing

Pregunta

Actualmente, estoy intentando usar Effort ( https://effort.codeplex.com/ ) con mi solución Entity Framework 6 para permitir la prueba de la unidad sin requerir una conexión de base de datos (consulte http://www.codeproject.com/Articles/460175 / Dos estrategias-para-prueba-Entity-Framework-Effort ). Todo funciona en mi proyecto, donde este es el DbContext con una interfaz y los constructores sobrecargados necesarios para Effort:

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; }
    }
}

El problema es que si actualizo el archivo .edmx "Actualizar modelo de la base de datos ...", entonces se regenera el archivo de contexto para que sea:

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; }
    }
}

Así que tengo que volver y actualizar manualmente el archivo Context.cs anterior cada vez. Además, elimina la [Key] del archivo POCO CCS_DEPT_TBL .

¿Hay alguna manera de configurar mi proyecto de Entity Framework para que no destruya la interfaz y los constructores sobrecargados cada vez que actualizo el modelo desde la base de datos? TIA.

ACTUALIZAR:

Como la clase es parcial, solo me aseguro de que la interfaz y los constructores sobrecargados se coloquen en un archivo separado que no se genere automáticamente.

ACTUALIZACIÓN 2:

De acuerdo, lo tengo, solo lo agregué como un archivo separado, sacando a DEPTID del archivo POCO original, pero aún coloca a DEPTID en el archivo generado, así que después de una actualización, la compilación se rompe porque hay dos valores de DEPTID en el mismo clase:

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; }
    }
}

Entonces, ¿cómo puedo evitar que genere DEPTID en el archivo de clase generado, ya que ya está en el archivo de clase parcial anterior?

Respuesta aceptada

Sí, la clase se define como una clase parcial. Cree un nuevo archivo que también declare la misma clase parcial y agregue sus métodos adicionales allí.

En cuanto a la pérdida del atributo [Clave], puede probar y usar un atributo MetadataType y colocar todos sus metadatos allí.

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; }    
    }
}

Respuesta popular

Gracias @Robert McKee! Esto es lo que terminé haciendo:

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: El HRADDbContext es en realidad entidades de base de datos, pero hay otros tres archivos * .edmx que son entidades de código primero en el mismo proyecto, por lo que comentamos esta excepción en HRModel.Context.cs porque no existe t aplicar Probablemente sería mejor separar las entidades de la base de datos en un proyecto separado para que esta excepción no se genere en una actualización del modelo de la base de datos.

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, donde la interfaz IHRADDbContext es necesaria para Effort:

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; }    
    }
}



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué