Le modèle de mise à jour entraîne la suppression de l'interface de DbContext lors de l'utilisation de Effort avec Entity Framework

c# effort entity-framework-6 unit-testing

Question

Actuellement, j'essaie d'utiliser Effort ( https://effort.codeplex.com/ ) avec ma solution Entity Framework 6 pour permettre les tests unitaires sans nécessiter de connexion à la base de données (voir http://www.codeproject.com/Articles/460175 / Deux stratégies pour tester Entity-Framework-Effort ). Tout fonctionne dans mon projet, où il s'agit du DbContext avec une interface et des constructeurs surchargés requis pour 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; }
    }
}

Le problème est que si je mets à jour le fichier .edmx en choisissant "Mettre à jour le modèle à partir de la base de données ...", il régénère le fichier de contexte pour qu'il soit:

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

Je dois donc revenir en arrière et mettre à jour manuellement le fichier Context.cs ci-dessus à chaque fois. En outre, supprime la [Key] du fichier POCO CCS_DEPT_TBL .

Existe-t-il un moyen de configurer mon projet Entity Framework de manière à ce qu'il ne supprime pas l'interface et les constructeurs surchargés chaque fois que je mets à jour le modèle à partir de la base de données? TIA.

METTRE À JOUR:

Comme la classe est partielle, je m'assure simplement que l'interface et les constructeurs surchargés sont placés dans un fichier séparé qui n'est pas généré automatiquement.

MISE À JOUR 2:

OK, il a obtenu, venez d' ajouter cela comme un fichier séparé, en prenant la DEPTID de l'original POCO fichier, mais il met toujours que DEPTID dans le fichier généré, donc après une mise à jour la construction des pauses parce qu'il ya deux DEPTID valeurs dans le même 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; }
    }
}

Alors, comment l'empêcher de générer DEPTID dans le fichier de classe généré, puisqu'il se trouve déjà dans le fichier de classe partiel ci-dessus?

Réponse acceptée

Oui, la classe est définie comme une classe partielle. Créez un nouveau fichier qui déclare également la même classe partielle et ajoutez-y vos méthodes supplémentaires.

En ce qui concerne l'attribut [Key] perdu, vous pouvez essayer d'utiliser un attribut MetadataType et y placer toutes vos métadonnées.

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

Réponse populaire

Merci à Robert McKee! Voici ce que j'ai fini par faire:

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 est en fait une entité première dans la base de données, mais trois autres fichiers * .edmx sont des entités dont le code est d'abord dans le même projet. t appliquer. Il serait probablement préférable de séparer les entités de la base de données d'abord dans un projet séparé afin que cette exception ne soit pas générée lors de la mise à jour d'un modèle de base de données.

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, où l'interface IHRADDbContext est nécessaire pour 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; }    
    }
}



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi