Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 在我的例子中,哪个层应该承载LinqToSql实体文件_C#_Entity Framework_Architecture - Fatal编程技术网

C# 在我的例子中,哪个层应该承载LinqToSql实体文件

C# 在我的例子中,哪个层应该承载LinqToSql实体文件,c#,entity-framework,architecture,C#,Entity Framework,Architecture,所以我环顾四周,没有发现任何和我说的很像的东西, 我知道有些类似,但这是一个更具体的问题 我在家里做项目,使用实体框架作为我的ORM提供者, 当我们在我的工作场所进行项目时,我们使用NHibernate,并且有不同的 为DM\DAL\BL等设置DLL。。如果实际映射的类和hbm文件设置在DM文件夹中,并且DB连接仅发生在DAL层,则所有项目都可以访问DM并使用模型来移动内容,即UI->-(WCF)->BL->DAL,然后再返回 我自己的项目也有类似的设置,但是当我开始实际使用EF映射数据库并了解

所以我环顾四周,没有发现任何和我说的很像的东西, 我知道有些类似,但这是一个更具体的问题

我在家里做项目,使用实体框架作为我的ORM提供者, 当我们在我的工作场所进行项目时,我们使用NHibernate,并且有不同的 为DM\DAL\BL等设置DLL。。如果实际映射的类和hbm文件设置在DM文件夹中,并且DB连接仅发生在DAL层,则所有项目都可以访问DM并使用模型来移动内容,即UI->-(WCF)->BL->DAL,然后再返回

我自己的项目也有类似的设置,但是当我开始实际使用EF映射数据库并了解其工作原理时,似乎无论我在哪里生成类,DB连接都必须存在

所以我的问题是我应该把实体类和数据库连接放在哪里?或者有没有一种方法可以将这两个类分开,并且仍然可以通过拖放轻松地生成类


提前谢谢

这是一个相当常见的问题。对于像EF和LINQtoSQL这样的ORM,真正的“DAL”是ORM层(它是实际数据访问的对象)。是的,像连接字符串这样的连接信息确实存在于模型级别,但是这种信息无论如何都应该来自底部,所以这不应该是一个真正的问题


因此,要回答您的问题,只需将ORM实体放入它们自己的程序集中并开始工作。

这是一个相当常见的问题。对于像EF和LINQtoSQL这样的ORM,真正的“DAL”是ORM层(它是实际数据访问的对象)。是的,像连接字符串这样的连接信息确实存在于模型级别,但是这种信息无论如何都应该来自底部,所以这不应该是一个真正的问题


因此,为了回答您的问题,只需将ORM实体放在它们自己的程序集中并开始工作。

还取决于您打算如何使用实体的“纯粹主义”——如果您有多个内存中的“数据”视图(例如DAL DTO、业务实体、跨WCF连接的DataContract类型实体以及UI的ViewModel数据等)然后将“DAL”实体留在DAL程序集中就可以了

然而,一个常见的更快更脏的解决方案是跨所有层重用POCO(根据Adam)-将这些POCO拆分为单独的程序集,然后从任何层引用POCO


如果使用Linq2SQL,这是不可能的,因为实体与DataContext紧密绑定(这意味着使用Linq2SQL实体的所有层都需要引用“Dal”-一点也不漂亮)

还取决于您打算如何使用实体的“purist”-如果您有多个“数据”的内存“视图”(例如,DAL DTO、业务实体、跨WCF连接的DataContract类型实体以及UI的ViewModel数据等)然后将“DAL”实体保留在DAL程序集中就可以了

然而,一个常见的更快更脏的解决方案是跨所有层重用POCO(根据Adam)-将这些POCO拆分为单独的程序集,然后从任何层引用POCO


AFAIK与Linq2SQL这是不可能的,因为实体紧密绑定到DataContext(这意味着使用Linq2SQL实体的所有层都需要引用“Dal”-一点也不漂亮)

这打破了层的概念,不是吗?如果我将它们放在不同的程序集中,任何引用该程序集的人都将具有DAL访问功能,这是我只想允许BL的功能。@RodD:EF和LinqToSql不是业务层对象(很明显,它们可以是,但不应该是因为你刚才指出的原因)。它们是数据模型对象。我要说的是,它们是数据模型层,数据访问层是你无法控制的(ORM层)。您仍然应该拥有自己的业务层,该层使用数据模型对象。感谢您的澄清。这种情况打破了层的概念,不是吗?如果我将它们放在不同的程序集中,任何引用该程序集的人都将具有DAL访问功能,这是我只希望允许BL的功能。@RodD:EF和LinqToSql不是业务层对象(很明显,它们可以是,但不应该是因为您刚才指出的原因)。它们是数据模型对象。我要说的是,它们是数据模型层,数据访问层是您无法控制的(它是ORM层)。您仍然应该拥有自己的业务层,使用数据模型对象。感谢您的澄清。我同意这并不漂亮,但因为这个项目是一个原型,不是一个大的项目,我想快速和肮脏也是正确的方式。从概念上讲,我认为微软应该给我们更多的东西,也许是一个实体生成如果知道如何创建两个单独的dll,一个DAL和一个DM,那么我们可以填写BL,任何想要做生意的人仍然可以拥有生成的实体,但必须通过BL。我同意这并不漂亮,但是因为这个项目是一个原型,不是一个大项目,我想快速和肮脏也是正确的方式。概念wis我认为微软应该给我们更多的东西,也许是一个实体生成器,它知道如何创建两个单独的dll,一个DAL和一个DM,然后我们可以填写BL,任何想要做生意的人都可以拥有生成的实体,但必须通过BL。