Das Update-Modell bewirkt, dass die Schnittstelle aus DbContext entfernt wird, wenn Sie Effort mit Entity Framework verwenden

c# effort entity-framework-6 unit-testing

Frage

Derzeit versuche ich, Effort ( https://effort.codeplex.com/ ) mit meiner Entity Framework 6-Lösung zu verwenden, um Komponententests zu ermöglichen, ohne dass eine Datenbankverbindung erforderlich ist (siehe http://www.codeproject.com/Articles/460175 / Zwei-Strategien-zum-Testen-Entity-Framework-Aufwand ). Alles funktioniert in meinem Projekt, wo dies der DbContext mit einer Schnittstelle und den für den Aufwand benötigten überladenen Konstruktoren ist:

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

Das Problem ist, wenn ich die .edmx Datei durch Auswahl von "Modell aus Datenbank aktualisieren ..." aktualisiere, dann wird die Kontextdatei neu erstellt:

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

Also muss ich zurückgehen und die obige Context.cs Datei jedes Mal manuell aktualisieren. POCO CCS_DEPT_TBL den [Key] aus der POCO CCS_DEPT_TBL Datei.

Gibt es eine Möglichkeit, mein Entity Framework-Projekt so einzurichten, dass es die Benutzeroberfläche und die überladenen Konstruktoren nicht jedes Mal wegbläst, wenn ich das Modell aus der Datenbank aktualisiere? TIA.

AKTUALISIEREN:

Da die Klasse partiell ist, stelle ich nur sicher, dass die Schnittstelle und die überladenen Konstruktoren in eine separate Datei eingefügt werden, die nicht automatisch generiert wird.

UPDATE 2:

OK, habe es, fügte das als eine separate Datei hinzu, die DEPTID aus der ursprünglichen POCO Datei, aber es setzt immer noch diese DEPTID in die generierte Datei, so dass nach einer Aktualisierung der Build bricht, weil es zwei DEPTID Werte in der gleichen sind Klasse:

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

Also, wie verhindere ich, dass es in der generierten Klassendatei DEPTID erzeugt, da es sich bereits in der obigen partiellen Klassendatei befindet?

Akzeptierte Antwort

Ja, die Klasse ist als Teilklasse definiert. Erstellen Sie eine neue Datei, die auch dieselbe Teilklasse deklariert und fügen Sie dort Ihre zusätzlichen Methoden hinzu.

Da das [Key] -Attribut verloren gehen kann, können Sie versuchen, ein MetadataType- Attribut zu verwenden und alle Ihre Metadaten dort zu speichern.

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

Beliebte Antwort

Danke @Robert McKee! Hier ist, was ich getan habe:

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: Der HRADDbContext ist eigentlich Datenbank-First-Entities, aber es gibt drei andere * .edmx-Dateien, die Code-First-Entities im selben Projekt sind, so dass diese Exception in HRModel.Context.cs auskommentiert wurde, weil dies nicht der Fall ist t bewerben. Es wäre wahrscheinlich besser, die Datenbank-first-Entities in ein separates Projekt zu separieren, so dass diese Ausnahme bei einem Datenbankmodell-Update nicht erzeugt würde.

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, wo die IHRADDbContext-Schnittstelle für den Aufwand benötigt wird:

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



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum