【问题标题】:Making Entity framework implement an interface使实体框架实现一个接口
【发布时间】:2014-05-12 12:32:09
【问题描述】:

我想将 IoC 与 Entity 框架和 Ninject 一起使用。我想我需要生成的实体类来实现一个接口 ICRUD。有一个walkthrough 展示了如何强制实体框架实现一个接口。我按照指示操​​作,我的 EntityObjectCodeGenerator.cs 文件确实显示“ICrud”,但没有实现接口。正如文章所说,我没有看到 EntityObjectCodeGenerator.tt 下的任何子类。我收到错误

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

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

例如

public HomeController(HomeService homeCrudService, PartialViewService1 partialviewService)

更新2
为了清楚起见并希望对其他人有所帮助,代码可以实现如下:

这是扩展实体的方式

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 以将模型类型也传递给方法。有很多选择。这对我有用,感谢 Jon Skeet 的专家指导。

【问题讨论】:

    标签: c# entity-framework asp.net-mvc-3 ninject


    【解决方案1】:

    大概生成的实体类是部分类吧?

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

    【讨论】:

    • 不同意。他希望它用于“生成的实体类”,这个解决方案可能是一场维护灾难......如果你明白我的意思......你可能会这样做;)
    • @Joep:这取决于需要什么,以及有多少类。如果它只是添加接口声明的情况,那么对于单个文件中的所有实体类很容易做到这一点,就像我在这里对协议缓冲区所做的那样:code.google.com/p/protobuf-csharp-port/source/browse/trunk/src/… 如果它需要更多的代码,它可能变得值得使用 T4。
    • 总有一种权衡……某处。如果它适用于所有类(我有这样的要求),也许是未来的类,那么实现无处不在的接口的基类会很好。如果只针对几个特定的​​类,那么手工制作的部分类将是可行的方法。
    • @BrettCaswell:我想这取决于你的经验。以前从未对 T4 做过任何事情,我认为这比添加部分类要花更长的时间:)
    【解决方案2】:

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

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

    【讨论】:

    • 这是一个绝妙的答案。我这辈子都不明白为什么它没有更多的赞成票。
    • 这应该是正确的答案吧?如果没有必要,为什么要制作一堆部分? EF 模板是基本模板,可以很高兴地对其进行编辑以添加更多功能!
    【解决方案3】:

    如何创建一个所有实体都派生自的基类(EntityModel 之外)(在 T4 模板文件中进行简单修改)并在基类中实现一次接口?它非常适合我。

    【讨论】:

      【解决方案4】:

      这是不久前的事了,但我是使用 T4 模板完成的……请参阅这篇文章:EntityFramework trigger like Auditing

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-22
        • 1970-01-01
        • 1970-01-01
        • 2015-06-17
        • 2011-09-07
        • 1970-01-01
        相关资源
        最近更新 更多