Обновление модели приводит к удалению интерфейса из DbContext при использовании Effort with Entity Framework


Вопрос

В настоящее время я пытаюсь использовать Effort ( https://effort.codeplex.com/ ) с моим решением Entity Framework 6, чтобы разрешить модульное тестирование без необходимости подключения к базе данных (см. Http://www.codeproject.com/Articles/460175 / Two-strategy-for-testing-Entity-Framework-Effort ). Все работает в моем проекте, где это DbContext с интерфейсом и перегруженными конструкторами, необходимыми для 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; }
    }
}

Проблема в том, что если я обновляю файл .edmx , выбирая «Обновить модель из базы данных ...», то он восстанавливает файл контекста:

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

Поэтому я должен вернуться и вручную обновить вышеупомянутый файл Context.cs каждый раз. Также удаляет [Key] из файла POCO CCS_DEPT_TBL .

Есть ли способ настроить мой проект Entity Framework, чтобы он не удалял интерфейс и перегруженные конструкторы при каждом обновлении модели из базы данных? ТИА.

ОБНОВИТЬ:

Поскольку класс является частичным, я просто гарантирую, что интерфейс и перегруженные конструкторы помещаются в отдельный файл, который не автогенерируется.

ОБНОВЛЕНИЕ 2:

ОК, получил его, просто добавил это как отдельный файл, извлекая DEPTID из исходного файла POCO , но он по-прежнему помещает DEPTID в сгенерированный файл, поэтому после обновления сборка ломается, потому что есть два значения DEPTID в одном и том же класс:

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

Итак, как я могу предотвратить создание DEPTID в сгенерированном файле класса, так как он уже находится в вышеуказанном частичном файле класса?

Принятый ответ

Да, класс определяется как частичный класс. Создайте новый файл, который также объявит тот же частичный класс и добавит туда дополнительные методы.

Что касается потерянного атрибута [Key], вы можете попробовать использовать атрибут MetadataType и поместить туда все свои метаданные.

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

Популярные ответы

Спасибо @ Роберту МакКи! Вот что я сделал:

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 на самом деле является сущностью базы данных, но есть три других файла * .edmx, которые являются объектами первого кода в одном проекте, поэтому закомментировали это исключение в HRModel.Context.cs, потому что оно не является t применяются. Вероятно, было бы лучше выделить отдельные объекты базы данных в отдельный проект, чтобы исключение не генерировалось при обновлении модели базы данных.

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, где интерфейс IHRADDbContext необходим для 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; }    
    }
}




Лицензировано согласно: CC-BY-SA
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему