Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在EntityFramework和NHibernate之间切换_C#_.net_Nhibernate_Frameworks_Entity - Fatal编程技术网

C# 在EntityFramework和NHibernate之间切换

C# 在EntityFramework和NHibernate之间切换,c#,.net,nhibernate,frameworks,entity,C#,.net,Nhibernate,Frameworks,Entity,我正在实施一个学院项目,以测试Entity Framework 4.0与NHibernate(最新版本)的性能。我正在构建一个简单的事务处理系统来做这个测试。我的实体将是客户、账户、订单、产品等 我想创建两个独立的DAL;第一个DAL将是EntityFramework,而第二个DAL将是NHibernate。然后,我将创建一个引用一个DAL或另一个DAL的业务逻辑层(BLL),并使用它进行测试。BLL将包括诸如“insertNewOrder()”、“amendExistingOrder()”等方

我正在实施一个学院项目,以测试Entity Framework 4.0与NHibernate(最新版本)的性能。我正在构建一个简单的事务处理系统来做这个测试。我的实体将是客户、账户、订单、产品等

我想创建两个独立的DAL;第一个DAL将是EntityFramework,而第二个DAL将是NHibernate。然后,我将创建一个引用一个DAL或另一个DAL的业务逻辑层(BLL),并使用它进行测试。BLL将包括诸如“insertNewOrder()”、“amendExistingOrder()”等方法。我希望我的BLL独立于框架,以便可以轻松地在每个DAL之间切换

为了实现这一点,我建议实现一个接口“IContext”,该接口将由每个DAL实现。“IContext”将包括每个实体的“get()”方法以及“Save()”方法。然后,每个DAL将以自己的特定方式实现这些方法。“get()”方法将返回IOObjectSet,而不是ObjectSet

我将使用T4模板从我的EDM创建POCO实体,并将其移动到单独的项目中。然后,每个DAL可以引用同一组POCO实体

然后,我的BLL将创建IContext接口的实例并在该接口上调用方法,而不是创建特定的上下文(ObjectContext或ISession)

这听起来是一个可行的解决方案吗?我找到的关于这个主题的任何文章都包括存储库的使用,我不完全理解这个模式,如果可能的话,我希望避免实现它。我的重点是测试每个平台,而不是构建架构正确的应用程序。例如,请参见此处:


我部分基于Julia Lerman的“编程实体框架第二版”中的一章。我对NH和EF(特别是NH)都是新手,因此任何建议都将不胜感激。谢谢

您要查找的是存储库模式。请参见(在许多其他位置中)作为示例

存储库模式背后的理念是为数据访问创建接口,例如:

public interface IAddressRepository
{
    Address GetById(int id);
}
然后创建该接口的两个实现:一个用于实体框架,另一个用于NHibernate


最后,创建一种机制,以基于接口获得所需的实现。像这样的IoC容器在这方面非常出色。

您正在寻找的是存储库模式。请参见(在许多其他位置中)作为示例

存储库模式背后的理念是为数据访问创建接口,例如:

public interface IAddressRepository
{
    Address GetById(int id);
}
然后创建该接口的两个实现:一个用于实体框架,另一个用于NHibernate


最后,创建一种机制,以基于接口获得所需的实现。像IoC这样的容器在这方面很好。

如果您想测试性能,您不应该创建中间层。在这两种情况下,使用具有相同输入/输出的原始代码,但仅此而已

在这两种情况下,创建中间层将限制您使用最小分母。通过分别实现这两个相互竞争的部分,您可以针对一种技术进行优化和具体实现,这在同一访问层中是不可能做到的


此外,您的任务不是创建相同的DAL,而是测试性能。所以,在尝试其他方法之前,您应该首先开始考虑这两种技术中的优化和特殊情况。

如果您想测试性能,您不应该创建中间层。在这两种情况下,使用具有相同输入/输出的原始代码,但仅此而已

在这两种情况下,创建中间层将限制您使用最小分母。通过分别实现这两个相互竞争的部分,您可以针对一种技术进行优化和具体实现,这在同一访问层中是不可能做到的


此外,您的任务不是创建相同的DAL,而是测试性能。因此,在尝试其他技术之前,您应该首先开始考虑这两种技术的优化和特殊情况。

请查看。将您的结果与之进行比较可能会很有趣。他们还描述和讨论测试,这可以给你更多的想法:检查。将您的结果与之进行比较可能会很有趣。他们还描述和讨论了测试,这可以给你更多的想法:谢谢你的回复。我想现在我会继续我的中间层方法。我很高兴将项目的范围限制在当应用于特定场景(本例中的事务处理系统)时框架在(相对)默认配置中的执行方式上。一位主管建议我确保比较同类,而且这些都是相当重要的框架。如果我分开看,我可能会有太多的材料,永远不会完成!谢谢你的回复。我想现在我会继续我的中间层方法。我很高兴将项目的范围限制在当应用于特定场景(本例中的事务处理系统)时框架在(相对)默认配置中的执行方式上。一位主管建议我确保比较同类,而且这些都是相当重要的框架。如果我分开看,我可能会有太多的材料,永远不会完成!