如何以及在何处将EF POCO映射到Business Objects

时间:2013-12-06 16:49:27

标签: 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 (an Asp.Net Webforms web application)

我在所有图层中使用我的POCO作为业务对象。我知道对此有一些争论,但这也被公认。

所以我有演讲服务>通过存储库获取POCO>返回演示并显示,例如HTML表并将编辑保存回数据库 - 很棒。

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

POCO

public class Book
{
     BookId
     string ExternalReference
}

public class Movie
{
     int MovieId
     string ExternalReference
}

建议的业务对象

public MovieAdaptation
{
     Book book;
     Movie movie;   
}

所以ExternalReference是外部的,不能是我数据库中的常用外键,因此我不能只使用导航属性来做Book.Movie。我需要做一个LINQ加入(可能)。

所以我的问题是:

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

2)我应该在哪里构建这个业务对象?它应该存放在Data.Access还是进一步的存储库中?

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 个答案:

答案 0 :(得分:0)

  

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

我可能会将其保留在服务层中。它与您的DAL无关,因为它是您的POCO的组合,而不是POCO本身。让服务层构造/破坏它(见下文)。

  

2)我应该在哪里构建这个业务对象?它应该存放在Data.Access还是进一步的存储库中?

在服务层中构造并销毁它。 DAL应该只发送和接收您的数据访问对象(您的POCO)。构建和销毁业务对象不是其工作描述的一部分。对于所有意图和目的,无论何时使用术语业务对象,它都应该高于DAL。

  

3)如何使用LINQ构建它。这是我到目前为止最好的拍摄,但它看起来效率很低,特别是如果我要返回这些列表。

我没有比你给出的例子更好的答案。听起来你必须执行2个查询,然后在你正在做的时候自己构建它。