Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.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# 实体框架与三层体系结构_C#_.net_Entity Framework_Architecture - Fatal编程技术网

C# 实体框架与三层体系结构

C# 实体框架与三层体系结构,c#,.net,entity-framework,architecture,C#,.net,Entity Framework,Architecture,我有一个三层架构的程序。问题是: 1.数据访问是EF的层? 2.如果我想使用EF从表示层生成的实体,那么我引用数据访问,但这违反了三层体系结构的原则。是EF将是您的数据访问层。 有了EF,您可以使用支持POCO的T4模板,然后您可以将这些POCO提取到单独的dll中,这将是您所有层的引用。您正在构建什么类型的应用程序?如果您正在构建ASP.NET MVC 3应用程序,则可以将视图作为表示层,将模型作为数据访问(可以使用EF)控制器和/或操作过滤器可以包含您的业务逻辑,在这种情况下,您将在表示层中

我有一个三层架构的程序。问题是:
1.数据访问是EF的层?

2.如果我想使用EF从表示层生成的实体,那么我引用数据访问,但这违反了三层体系结构的原则。

是EF将是您的数据访问层。
有了EF,您可以使用支持POCO的T4模板,然后您可以将这些POCO提取到单独的dll中,这将是您所有层的引用。

您正在构建什么类型的应用程序?如果您正在构建ASP.NET MVC 3应用程序,则可以将视图作为表示层,将模型作为数据访问(可以使用EF)控制器和/或操作过滤器可以包含您的业务逻辑,在这种情况下,您将在表示层中使用EF模型,但仍然满足关注点分离原则

EF做两件事:-

1) 为您生成域模型(可选,但常用) 2) 使您能够通过该域模型查询/修改数据库

这可能会使域模型和数据访问之间的界限变得模糊,但两者确实是分开的


只要你没有直接在演示层中创建对象上下文和编写查询之类的工作,那么你就没有打破抽象——你唯一“打破”的地方是,你需要在演示项目中引用System.Data.Objects(或EF dll中的任何东西)(这只是一个物理工件)除非您按照Jethro建议的路线将域模型生成到一个单独的项目中。

Microsoft Spain为codeplex上的N层应用程序发布了一个非常好的文档、指南和示例应用程序,您可以在此处查找:

您将在那里找到许多方向和有用的实现模式


对于三层体系结构,我将考虑使用领域模型和数据模型模式进行抽象,而不是从表示层直接做EF。 因此,我们的想法是,您有自己的数据模型,其中包含EF POCO类和存储库,这些存储库知道如何访问各种CRUD的这些类

您的域模型将具有与您的客户机相关的模型(因此您可以放置各种ViewModels或与验证相关的代码),它可以是WPF或MVC web应用程序。 现在,在这两者之间,有一项业务同时涉及域和数据模型

您的表示层对EF/数据层/存储库一无所知。当您想要引入新的数据框架或数据库时,您只需要编写新的存储库类和数据模型类(可能需要某种代码生成)


这也允许您的代码也可以进行单元测试。

我使用netTcpBinding构建wcf服务,但使用提供web服务软件工厂的体系结构。如果我从服务实现中引用数据访问,或者从表示层引用任何其他应用程序中的数据访问,这在体系结构中都不会是一个错误。我认为,任何B提取模型是为了限制依赖性,所以如果您的ServiceContract中有SQL语句,那么我会说您的服务实现“过于依赖”您的数据访问。但是EF本身提供了抽象。我建议您创建一个存储库类,从EF上下文中提取您的服务。我在回答你的问题吗?当然,我和Manager一起做了抽象,它执行删除、编辑、GetById、GetAll、Add方法,但这是业务逻辑,我指的是当你从表示层或处理程序项目(逻辑)中引用EF模型时生成的实体,如客户、生产者……croisharp您只是需要模型定义(类),您的数据库访问仍然保留在您的数据层中,因此不要担心!+1使用POCO提供了所需的抽象级别,以确保维护体系结构的完整性。证据?您可以替换数据访问实现,但保留POCO作为数据契约。