gpt4 book ai didi

c# - 使 Entity Framework 实现一个接口(interface)

转载 作者:IT王子 更新时间:2023-10-29 04:09:07 28 4
gpt4 key购买 nike

我想将 IoC 与 Entity Framework 和 Ninject 结合使用。我认为我需要生成的实体类来实现接口(interface) ICRUD。有一个 walkthrough这显示了如何强制 Entity Framework 实现接口(interface)。我按照说明进行操作,我的 EntityObjectCodeGenerator.cs 文件确实显示了“ICrud”,但没有实现接口(interface)。正如文章所说,我没有在 EntityObjectCodeGenerator.tt 下看到任何子类。我收到错误

'BugnetMvc.Models.BugNetEntities' does not implement interface member 'BugnetMvc.Services.ICrud.Update()'

更新
目标是创建一个可测试、可扩展的 MVC-3 Intranet,利用 Entity Framework ,该框架还支持强类型 View 和部分 View 。到目前为止,从我对 Ninject 的少量经验来看,我相信我需要使用 View 本身的服务重载我的 Controller 的构造函数(假设 CRUD 方法可用于每个接口(interface))并且每个局部 View 都有一个服务:

例如

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) 的需求,在这种情况下,使用与上述相同的基本思想的新接口(interface)应该可以解决问题。甚至可以更新 ICrud 以将模型类型也传递到方法中。有很多选择。这对我有用,感谢 Jon Skeet 的专家指导。

最佳答案

大概生成的实体类是部分类,对吗?

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

关于c# - 使 Entity Framework 实现一个接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5044596/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com