Заставить Entity Framework реализовать интерфейс - PullRequest
31 голосов
/ 18 февраля 2011

Я хочу использовать IoC с Entity Framework и Ninject.Я полагаю, что мне нужны классы Generated Entity для реализации интерфейса, ICRUD.Существует пошаговое руководство , которое показывает, как заставить Entity Framework реализовать интерфейс.Я следовал указаниям, и мой файл EntityObjectCodeGenerator.cs действительно показывает «ICrud», но не реализует интерфейс.Я не вижу подклассов в EntityObjectCodeGenerator.tt, как говорится в статье.Я получаю сообщение об ошибке

«BugnetMvc.Models.BugNetEntities» не реализует элемент интерфейса «BugnetMvc.Services.ICrud.Update ()»

ОБНОВЛЕНИЕ Цель состоит в том, чтобы создать тестируемую расширяемую интрасеть MVC-3, использующую структуру сущностей, которая также поддерживает строго типизированные представления и частичные представления.Исходя из своего небольшого опыта работы с Ninject, я считаю, что мне нужно перегрузить конструктор моего контроллера службой для самого представления (допустим, методы CRUD доступны для каждого интерфейса) и по одному для каждого частичного представления:

EG

public HomeController(HomeService homeCrudService, PartialViewService1 partialviewService)

Обновление2 Чтобы быть понятным и, надеюсь, помочь другим, код может быть реализован следующим образом:

Вот как можно расширить Entity

namespace BugnetMvc.Models//ensure namespace matches entity
{
    public partial class Milestone : ICrud<Milestone>//Entity, note the CRUD generic.  This gives us a lot of flexibility working with Ninject
    {
        public bool Create()
        {
            throw new System.NotImplementedException();
        }

        public List<Milestone> Read()
        {
            var milestones = new List<Milestone>();

            var result = from a in new BugNetEntities1().Milestones
                            where a.MilestoneID >= 0
                            select new { a.Milestone1 };

            milestones = result.AsEnumerable()
                                        .Select(o => new Models.Milestone
                                        {
                                            Milestone1 = o.Milestone1
                                        }).ToList();
            return milestones;
        }

        public bool Update()
        {
            throw new System.NotImplementedException();
        }

        public bool Delete()
        {
            throw new System.NotImplementedException();
        }
    }

Пример Mock-сущности:

namespace BugnetMvc.Services
{
    public class MilestoneServiceMock : ICrud<MilestoneMock>
    {
        public MilestoneServiceMock()
        {

        }

        public bool Create()
        {
            throw new System.NotImplementedException();
        }

        public bool Update()
        {
            throw new System.NotImplementedException();
        }

        public bool Delete()
        {
            throw new System.NotImplementedException();
        }


        List<MilestoneMock> ICrud<MilestoneMock>.Read()
        {
            //string[] mileStones = new string[14];
            List<MilestoneMock> milestoneMocks = new List<MilestoneMock>();
            milestoneMocks.Add(new MilestoneMock("New"));
            milestoneMocks.Add(new MilestoneMock("Assessment"));
            milestoneMocks.Add(new MilestoneMock("Pending Approval"));
            milestoneMocks.Add(new MilestoneMock("Pending Start"));
            milestoneMocks.Add(new MilestoneMock("Planning"));
            milestoneMocks.Add(new MilestoneMock("Dev-In Process"));
            milestoneMocks.Add(new MilestoneMock("Dev-Pending Approval to QA"));
            milestoneMocks.Add(new MilestoneMock("Dev-Pending Move to QA"));
            milestoneMocks.Add(new MilestoneMock("QA-In Process"));
            milestoneMocks.Add(new MilestoneMock("QA-UAT"));
            milestoneMocks.Add(new MilestoneMock("QA-Pending Approval to Prod"));
            milestoneMocks.Add(new MilestoneMock("QA-Pending Move to Prod"));
            milestoneMocks.Add(new MilestoneMock("On-Going"));
            return milestoneMocks;
        }
    }
}
//Global.asax
        internal class SiteModule : NinjectModule
        {
            public override void Load()
            {
                bool MOCKDB = true;
                MOCKDB = false;
                if (MOCKDB)
                {
                    //Set up ninject bindings here.
                    Bind<ICrud<MilestoneMock>>().To<MilestoneServiceMock>();
                    Bind<ICrud<Application>>().To<ApplicationService>();
                }
                else
                {
                    //Set up ninject bindings here.
                    Bind<ICrud<Milestone>>().To<Milestone>();
                    Bind<ICrud<Application>>().To<ApplicationService>();
                }
            }
        }

Может возникнуть необходимость в Read (int Id), и в этом случае новый интерфейс, использующий те же основные идеи, что и выше, должен сработать.Можно даже обновить ICrud для передачи типа модели в методы.Там много вариантов.Это сработало для меня, спасибо Джону Скиту за его профессиональное руководство.

Ответы [ 4 ]

57 голосов
/ 18 февраля 2011

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

Если это так, вы можете просто добавить свои собственные файлы частичных классов, чтобы указать интерфейсы, которые должны быть реализованы, и предоставить любые необходимые методы реализации.Я подозреваю, что это будет намного проще, чем изменить то, что генерируется.

7 голосов
/ 18 февраля 2011

Реализация интерфейса должна быть добавлена ​​в шаблон T4 при его изменении.На снимках экрана это не показано, но в качестве элемента 13 упоминается, что пользователь должен реализовать интерфейс IValidate в шаблоне T4.Как только реализация предоставлена, сгенерированные классы также будут иметь эти реализации.

Пользователь: отмечает, что сгенерированные классы (в файле .tt) реализуют интерфейс IValidate, как и ожидалось

1 голос
/ 18 февраля 2011

Как насчет создания базового класса (вне EntityModel), из которого все производные получают (простая модификация в файле шаблона T4) и реализации интерфейса в базовом классе один раз?Это прекрасно работает для меня.

0 голосов
/ 19 февраля 2011

Это было некоторое время назад, но я сделал это, используя шаблон T4 ... см. Этот пост: Триггер EntityFramework, такой как Auditing

...