将API项目中的ViewModels绑定到.NET CORE 2 EF中DAL项目的POCO类

时间:2018-05-29 12:31:17

标签: c# entity-framework asp.net-mvc-viewmodel

最近,我们在.NET CORE 2中启动了一个新的(API)项目,它在API项目中有一些端点,在单独的DAL项目中有数据库(POCO)模型(EF CORE)。

通过使用Entity Framework Core和FluentAPI,我们首先构建数据库代码。

在两个项目中都创建了一些概念验证端点和表(也具有多对多关系)。这一切似乎都很好。

我们现在面临的问题是,有些POCO类与其他表/ POCO类有关系,请参阅下面的示例:

public class Medium
{
    public Medium()
    {
        this.Hold = new HashSet<Hold>();
        this.InExMedium = new HashSet<InExMedium>();
    }

    public long MediumID { get; set; }

    public long SolutionID { get; set; }

    public string Name { get; set; }

    public Solution Solution { get; set; }

    public ICollection<Hold> Hold { get; set; }

    public ICollection<InExMedium> InExMedium { get; set; }
}

在我们的Medium端点中,我们不希望在Hold函数中显示或评估InExMediumModelState.IsValid属性。

我们的第一个解决方案是制作这些属性internal而不是public,这在开始时起作用。但是,我们很快意识到这不是正确的方法,因为其他功能无法再正常使用(例如 LINQ )。

至少我认为,解决方案是使用介于两者之间的图层ViewModels

对于上述问题,我创建了以下(测试)ViewModel

public class MediumViewModel
{
    public Medium Medium { get; set; }

    public InExMedium InExMedium { get; set; }

    public Solution Solution { get; set; }

    public Hold Hold { get; set; }
}

我知道这个ViewModel与原始POCO类相同,但我只是想在端点控制器中使用一些LINQ来测试它。

然而,我立刻偶然发现了几个问题。例如,所有POCO类都添加到我们的DBContext类中,但是如何将ViewModel链接到它?这甚至需要吗?

当我尝试使用刚刚创建的ViewModel作为模型和我们的DbContext作为数据上下文类来Scafold API控制器时,我收到以下错误:

There was an error running the selected code generation: 'Could not add Model type MyProject.API.Viewmodels.MediumViewModel' to DbContext 'MyProject.MyDbContextClass'. Please make sure that 'MyProject.MyDbContextClass' has a DbSet property for 'MyProject.API.Viewmodels.MediumViewModel'

处理此问题的最佳方法是什么?我已经阅读了一些关于AutoMapper的内容,但我不想使用其他库来实现这一目标。

在API控制器中,我正在使用DbContext,如下所示:

    public class MediaController : TrsBaseController
    {

        public MediaController(MyDbContext context)
            : base(context)
        {

        }

        //// GET: api/media
        [HttpGet]
        public async Task<IEnumerable<Medium>> GetMedia()
        {
            return await this.Context.Medium.ToListAsync();
        }
    }

使用ViewModel时,我仍然可以使用上述DbContext,还是应该以不同方式实施?

我已经四处寻找关于这个问题的好教程,但我想我正在搜索错误的关键字,因为我找不到很多教程(这些教程也是最新的.NET CORE 2)。

1 个答案:

答案 0 :(得分:1)

这对你有用吗?我将MediumViewModel更改为示例。你可以让它异步!

public class MediaController : TrsBaseController
{

    public MediaController(MyDbContext context)
        : base(context)
    {

    }

    //// GET: api/media
    [HttpGet]
    public IEnumerable<MediumViewModel> GetMedia()
    {
        var result = this.Context.Medium.ToList();
        return result.Select(x=> new MediumViewModel {Medium = x.MediumID, Solution  = x.SolutionID}); // and so on
    }
}

public class MediumViewModel
{
    public long Medium { get; set; }

    public long Solution { get; set; }
}