C# 如何将POCO层与实体框架层分离,并且仍然能够向对象添加业务逻辑
我在这里看到了很多这类问题,但它们要么没有得到回答,要么与我要问的问题不完全相同,要么与我需要的细节不同 我在下面附上了我的项目的一个屏幕截图,以获得对事物的高级参考视图C# 如何将POCO层与实体框架层分离,并且仍然能够向对象添加业务逻辑,c#,entity-framework,poco,n-tier-architecture,C#,Entity Framework,Poco,N Tier Architecture,我在这里看到了很多这类问题,但它们要么没有得到回答,要么与我要问的问题不完全相同,要么与我需要的细节不同 我在下面附上了我的项目的一个屏幕截图,以获得对事物的高级参考视图 在我的“示例”解决方案中,我目前有一个名为Sample.Data.Model的项目,其中包含我的数据库第一个模型的edmx文件 然后,我将自动生成的POCO类移动到一个单独的项目中,并将其命名为Sample.Data.Entities 然后,我在我的Sample.Data.Model项目中引用了Sample.Data.Enti
Sample.Data.Model
的项目,其中包含我的数据库第一个模型的edmx文件李>
Sample.Data.Entities
李>
Sample.Data.Model
项目中引用了Sample.Data.Entities
项目,并修复了所有用法,从而成功构建了我的项目Sample.Data.Entities
项目中为我的分部类添加了一个PartialClasses
文件夹namespace Sample.Data.Entities
{
public partial class User
{
public string FullName
{
get
{
return string.Format("{0} {1}", this.FirstName, this.LastName);
}
}
}
public User GetUser(int userID)
{
using (var dc = new ProntoEntities())
{
return (from u in dc.Users where u.ID == userID select u).SingleOrDefault();
}
}
}
然后在MVC项目中,我可以做这样的事情
User user = new User();
user = user.GetUser(1);
或
但是,在当前的设置中我不能这样做,因为分部类对实体一无所知
所以,我的问题是,在我当前的设置中,我把数据的“查询”放在哪里
另外,如果我要为我的MVC项目制作“视图模型”,这些模型应该放在哪里?我通常会把它们与我的分部类和edmx文件放在同一个项目中
所以,我的问题是,在我当前的设置中,我把数据的“查询”放在哪里
我认为你应该使用神奇的存储库模式。
例如: 另外,如果我要为我的MVC项目制作“视图模型”,这些模型应该放在哪里
由于viewmodel包含连接到其视图的数据,我相信您不需要将实体或其部分类放在一起。如果我是你,我只是把它放在MVC项目的Model文件夹中 您可能对使用开放源码感兴趣,它在服务器端使用实体框架,并生成整个基础架构,用于构建基于WCF的n层体系结构,包括客户端类似EF的API。请查看可在codeplex上下载的框架用户指南和示例应用程序。结果解决方案高度可定制,同时提供了放置内容的指导。感谢您的回复!!我将研究存储库模式,但我希望有一些更简单的东西。另外,我并不热衷于将我的ViewModels放在MVC项目中,因为我喜欢将我的数据查询从业务层作为ViewModels返回,如下所示:有关更多详细信息,请查看以下内容:您可以将基本存储库的方法标记为虚拟,这样您就可以在当前存储库中修改每个方法。例如UserRepository。对于viewmodels:好的,那么对于“viewmodels”,我的术语可能是关闭的。我想我指的只是简单的对象模型。与从BLL返回整个用户对象到控制器不同,我更愿意返回控制器传递到视图所需的属性的模型。然而,ViewModel链接很有帮助。对于我来说,这可能也是一个开始使用的好主意。我最终使用了存储库模式和业务逻辑管理器。您的主要问题是,您试图在围绕持久性的体系结构中实现活动记录。实体不应承担CRUD责任。这是用于上下文和
DbSet
s的。然后,您可以有一个知道DAL(上下文+实体)的服务层,并且可能知道一个带有视图模型的库(或者包含视图模型)。控制器层只与服务层通信。很好的资源建议-我来看看。
User user = new User();
user.FirstName = "John";
user.LastName = "Smith";
user.Update();