最近,我们在.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
函数中显示或评估InExMedium
和ModelState.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)。
答案 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; }
}