Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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# 如何将POCO层与实体框架层分离,并且仍然能够向对象添加业务逻辑_C#_Entity Framework_Poco_N Tier Architecture - Fatal编程技术网

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文件
  • 然后,我将自动生成的POCO类移动到一个单独的项目中,并将其命名为
    Sample.Data.Entities
  • 然后,我在我的
    Sample.Data.Model
    项目中引用了
    Sample.Data.Entities
    项目,并修复了所有用法,从而成功构建了我的项目
  • 我当然需要添加到POCO类中,因此我在
    Sample.Data.Entities
    项目中为我的分部类添加了一个
    PartialClasses
    文件夹
  • 这就是我迷路的地方。在较小的(非n层项目)中,我的edmx文件和分部类位于同一项目中,因此我可以在分部类文件中添加与类对象相关的方法,如下所示:

    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();