Linq 如何以及在何处将EF POCO映射到业务对象

Linq 如何以及在何处将EF POCO映射到业务对象,linq,entity-framework,ef-code-first,Linq,Entity Framework,Ef Code First,我有这些项目 Domain.Model (contains code first POCOs) Data.Context (contains the context & migrations only) Data.Access (contains IGenericRepository & GenericRepository) Service (contains BL service classes and UnitsOfWork) Presentation.Admin

我有这些项目

Domain.Model (contains code first POCOs)
Data.Context (contains the context & migrations only)
Data.Access  (contains IGenericRepository & GenericRepository)
Service      (contains BL service classes and UnitsOfWork)
Presentation.Admin (an Asp.Net Webforms web application)
我使用我的POCO作为跨所有层的业务对象。我知道关于这一点有一些争论,但这也被广泛接受

因此,我有演示调用服务>通过存储库获取POCO>返回演示并显示,例如HTML表,并将编辑内容保存回DB-太好了

现在我有了一个更复杂的页面,我认为它需要一个业务对象。这是一个由类似的例子组成的例子

波科

建议的业务对象

public MovieAdaptation
{
     Book book;
     Movie movie;   
}
所以ExternalReference是外部的,不能是我数据库中的公共外键,所以我不能只使用导航属性执行Book.Movie。我可能需要做一个LINQ连接

因此,我的问题是:

1我应该在何处定义此业务对象。目前它只是在服务层中,因为只有引用服务层的东西才会使用它

2我应该在哪里构建此业务对象?它应该在存储在数据访问的存储库中,还是在更高的存储库中

3如何使用LINQ构造它。这是我迄今为止最好的一张照片,但似乎效率很低,特别是如果我返回这些照片的列表

namespace MyProject.Services
{
    public class AdaptationsService
    {
        AdaptationUnitOfWork _unitOfWork;

        public AdaptationService
        {
            unitOfWork =  new AdaptationUnitOfWork();
        }

        public Adaption GetAdaptations(string externalReference)
        {

            //Can anyone improve this maybe using LINQ join (as maybe it won't be getting books/movies by SingleOrDefault but by where

            Book book= _unitOfWork.BookRepository.Get.SingleOrDefault(b=>b.ExternalReference==externalReference);
            Movie movie= _unitOfWork.MovieRepository.Get.SingleOrDefault(m=>m.ExternalReference==externalReference);

            Adaptation adaptation = new Adaptation();
            adaptation.Book=book;
            adaptation.Movie=movie;

        }

    }

}
1我应该在何处定义此业务对象。目前它只是在服务层中,因为只有引用服务层的东西才会使用它

我可能会把它放在服务层。这与你的DAL无关,因为它是你的POCO的组合,而不是POCO本身。让服务层构造/破坏它,见下文

2我应该在哪里构建此业务对象?它应该在存储在数据访问的存储库中,还是在更高的存储库中

在服务层构造并销毁它。DAL应仅向POCO发送和接收数据访问对象。构建和销毁业务对象不是it工作描述的一部分。出于所有意图和目的,无论何时使用术语“业务对象”,它都应该位于DAL之上

3如何使用LINQ构造它。这是我迄今为止最好的一张照片,但似乎效率很低,特别是如果我返回这些照片的列表

namespace MyProject.Services
{
    public class AdaptationsService
    {
        AdaptationUnitOfWork _unitOfWork;

        public AdaptationService
        {
            unitOfWork =  new AdaptationUnitOfWork();
        }

        public Adaption GetAdaptations(string externalReference)
        {

            //Can anyone improve this maybe using LINQ join (as maybe it won't be getting books/movies by SingleOrDefault but by where

            Book book= _unitOfWork.BookRepository.Get.SingleOrDefault(b=>b.ExternalReference==externalReference);
            Movie movie= _unitOfWork.MovieRepository.Get.SingleOrDefault(m=>m.ExternalReference==externalReference);

            Adaptation adaptation = new Adaptation();
            adaptation.Book=book;
            adaptation.Movie=movie;

        }

    }

}

我没有比你举的例子更好的答案了。听起来您必须执行两个查询,然后自己构建它

所以你有点同意我的做法。其他人能建议如何改进企业实体的建设吗?或者我做得对吗?我将如何处理持续性。例如,修改后的业务对象被传递到服务层UpdateAdaption。UpdateAdaption必须将其分解为POCO并进行存在检查和更新?是的,我非常同意。是的,服务层将把业务对象解构成2个POCO,并分别保存它们。