使实体框架实现一个接口

P.B*_*key 31 c# entity-framework ninject asp.net-mvc-3

我想将IoC与Entity框架和Ninject一起使用.我想我需要Generated Entity类来实现一个接口ICRUD.这是一个演练,展示了如何强制实体框架实现一个接口.我按照指示操​​作,我的EntityObjectCodeGenerator.cs文件确实显示"ICrud",但没有实现接口.我没有在EntityObjectCodeGenerator.tt下看到任何子类,因为文章说我应该这样做.我收到错误

'BugnetMvc.Models.BugNetEntities'没有实现接口成员'BugnetMvc.Services.ICrud.Update()'

更新
目标是利用实体框架创建可测试的,可扩展的MVC-3内部网,该框架还支持强类型视图和部分视图.根据我迄今为止对Ninject的小经验,我相信我需要使用View本身的服务(假设每个接口可用的CRUD方法)重载我的Controller的构造函数,并为每个局部视图添加一个:

例如

public HomeController(HomeService homeCrudService, PartialViewService1 partialviewService)
Run Code Online (Sandbox Code Playgroud)

Update2
为了清楚并希望帮助他人,代码可以实现如下:

这就是人们如何扩展实体

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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

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>();
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

可能会出现对Read(int Id)的需求,在这种情况下,使用上述相同基本思想的新界面应该可以解决问题.甚至可以更新ICrud以将模型类型传递给方法.有很多选择.这对我有用,感谢Jon Skeet的专家指导.

Jon*_*eet 57

据推测,生成的实体类是部分类,对吗?

如果是这样,您可以添加自己的部分类文件来指定要实现的接口 - 并提供您需要的任何实际实现方法.我怀疑这比改变生成的内容要简单得多.

  • 那是完全正确的.我一直这样做. (2认同)

ami*_*t_g 7

接口实现将在修改时添加到T4模板.它没有在屏幕截图中显示,但是作为项目13提到用户必须在T4模板中实现IValidate接口.一旦提供了实现,生成的类也将具有这些实现.

用户:注意生成的类(在.tt文件下)按预期实现IValidate接口