Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.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# MVC3应用中的解耦实体框架_C#_Asp.net Mvc 3_Entity Framework_Dependency Injection_Decoupling - Fatal编程技术网

C# MVC3应用中的解耦实体框架

C# MVC3应用中的解耦实体框架,c#,asp.net-mvc-3,entity-framework,dependency-injection,decoupling,C#,Asp.net Mvc 3,Entity Framework,Dependency Injection,Decoupling,在使用实体框架作为数据访问层的MVC3 web应用程序中,我有一些关于解耦域层和数据层的问题 目前,我的控制器完全依赖于EF类,在花了一天的时间阅读依赖注入之后,我正在尝试将它们解耦 我的第一个问题是-我是否需要有效地将所有EF类复制到我的业务层中?很明显,我不能再使用EF类了,所以在我看来,我需要为使用中的每个表类创建一个副本,以使其正常工作。是这样吗?例如,如果我的数据库中有50个EF类代表50个表,那么我是否需要在我的业务层中创建50个新类?->然后无限期地维护它们?这听起来需要做很多工作

在使用实体框架作为数据访问层的MVC3 web应用程序中,我有一些关于解耦域层和数据层的问题

目前,我的控制器完全依赖于EF类,在花了一天的时间阅读依赖注入之后,我正在尝试将它们解耦

我的第一个问题是-我是否需要有效地将所有EF类复制到我的业务层中?很明显,我不能再使用EF类了,所以在我看来,我需要为使用中的每个表类创建一个副本,以使其正常工作。是这样吗?例如,如果我的数据库中有50个EF类代表50个表,那么我是否需要在我的业务层中创建50个新类?->然后无限期地维护它们?这听起来需要做很多工作


其次,我是否正确地假设依赖性会发生变化,而不是业务层依赖于数据层,而是数据层最终依赖于业务层?

对于实体的复制。。。这取决于EF的版本和您使用的方法

如果使用,则您的模型与EF无关,因为您的实体不继承自
EntityObject
。这样你就不必复制你的实体了。在运行时,由于代理实体的存在,EF将生成从POCO继承的动态类型,并添加所有用于延迟加载的EF管道…等等

在任何情况下,请注意,由于ASP.NETMVC,您最终总是会将一些模型类复制到所谓的视图模型中,因此您可以强烈地键入视图

第二,我假设依赖性被翻转了,对吗 而不是依赖于数据的业务层 数据层最终依赖于业务 层


不,数据层不应该知道业务层。

您可以将模型类放在单独的程序集中,并与上下文关联

如果这样做,您的数据层、业务层和网站都可以引用模型程序集,但您可以隔离其他依赖项-例如,网站程序集不会直接引用数据层,这意味着它也不必引用EF

如果您先使用代码,这很简单

如果您首先使用数据库,则从上下文程序集中删除对model.tt文件的引用。不要删除或移动它,而是在新模型部件中添加指向它的链接


要添加链接,请在解决方案资源管理器中右键单击项目,然后选择“添加->现有项”。然后会出现一个文件选择器对话框。该对话框上的“添加”按钮有一个下拉列表,您可以选择“添加为链接”。

我创建了单独的视图模型供我的视图使用,并从我的EF模型中填充这些模型。我想您会发现,现在在控制器中使用EF模型是一种趋势(即使您与EF耦合),只要您不将这些模型返回到视图,这通常不是一个大问题,除非您打算更改持久性框架,这一点现在越来越没有理由提出这个问题,但是我如何知道我是否在使用POCO实体?因为我是从林肯来的,所以一切都很新。我可以告诉您的是,我首先使用DB创建EF类,其余的由设计器完成——就像在LINQ2SQL中一样。如果DAL不知道BL,DAL返回的“类型”是什么?数据集?我希望返回表示我的数据的正确类。@Grant您可以做的是查看您的实体是否继承或实现任何与EF相关的类/接口(EntityObject)。我看不到对EntityObject的任何引用。我有model.context.tt和设计师。首先是图表,然后是model.tt,下面有一堆表示我所有表的类。这是否意味着我正在使用POCO实体?@Grant如果您有T4模板(*.tt文件),并且如果您的实体没有从任何EF相关类继承,那么是的。我如何确切地删除对我的model.tt文件的引用?您是否建议这些EF类是我的域模型类,我应该这样使用它们?要删除对
model.tt
文件的引用,请在解决方案资源管理器中右键单击它,然后选择“从项目中排除”,是的,因为POCO类本质上只是数据桶,使用它们在所有程序集之间移动数据变得越来越常见。这样做的好处是导航属性(数据库的模式)被编码在其中,因此您可以在网站程序集中创建类似于
Where
OrderBy
子句的内容,而无需参考EF或甚至您的
DbContext
感谢Nicholas。但是model.tt文件下没有选项可从项目中排除或删除..-我只能排除父模型.context.tt。。不是model.tt应该有-您确定正在查看“解决方案资源管理器”选项卡吗?