Entity framework core 不存在实体的FromSql

Entity framework core 不存在实体的FromSql,entity-framework-core,Entity Framework Core,我有一个非常大的现有数据库,有许多视图和表。我需要合并一些视图和表的结果。我希望这个组合数据在DbContext中可用,但是没有一个对应的视图或表可以用来将实体映射到我想要的SQL结果 为此,我在上下文中设置了一个DbQuery,并使用OnModelCreating方法设置查询结果,下面是一个示例 以下是实体对象模型。在本例中,Author和Book是表,AuthorBookCount是自定义SQL查询的对象模型,该查询没有要映射到的对应视图或表 公共类作者 { [列(“ID”)] 公共int

我有一个非常大的现有数据库,有许多视图和表。我需要合并一些视图和表的结果。我希望这个组合数据在DbContext中可用,但是没有一个对应的视图或表可以用来将实体映射到我想要的SQL结果

为此,我在上下文中设置了一个DbQuery,并使用OnModelCreating方法设置查询结果,下面是一个示例

以下是实体对象模型。在本例中,
Author
Book
是表,
AuthorBookCount
是自定义SQL查询的对象模型,该查询没有要映射到的对应视图或表

公共类作者
{
[列(“ID”)]
公共int Id{get;set;}
[列(“名字”)]
公共字符串名{get;set;}
[列(“姓氏”)]
公共字符串LastName{get;set;}
}
公共课堂用书
{
[列(“ID”)]
公共int Id{get;set;}
[栏目(“作者ID”)]
公共int AuthorId{get;set;}
[栏目(“标题”)]
公共字符串标题{get;set;}
}
公共类AuthorBookCount
{
[栏目(“作者全名”)]
公共字符串AuthorFullName{get;set;}
[列(“账面计数”)]
公共长簿记计数{get;set;}
}
然后我设置
DbContext
如下:

公共类MyDbContext:DbContext
{
公共数据库集作者{get;set;}
公共数据库集书籍{get;set;}
公共数据库查询AuthorBookCounts{get;set;}
配置时受保护的覆盖无效(DBContextOptions Builder Options Builder)
{
//设置cnxn字符串
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Query().ToQuery(()=>
AuthorBookCounts.FromSql(“选择DISTINCT(Authors.FIRST\u NAME+“”+Authors.LAST\u NAME)作为AUTHOR\u全名,COUNT(Books.Id)从Authors加入图书。AUTHOR\u Id=Authors.Id分组依据(Authors.FIRST\u NAME+“”+Authors.LAST\u NAME)”);
}
}
现在,当我尝试使用我的
AuthorBookCounts
属性时,我得到一个SystemNotSupported异常,并显示一条消息,说明当前不支持FromSql

我将我的
从query
SQL调用更改为LINQ查询,它可以正常工作。此解决方案的问题是,我的SQL调用非常复杂,一直将SQL转换为LINQ语句是一件非常痛苦的事情


任何关于发生了什么或我做错了什么的解释都将不胜感激。

就像所有的大问题一样,解决这个问题的方法非常简单。在
ToQuery
方法中,将对
DbQuery
属性
authorkcounts
的引用替换为另一个
Query
引用,如下所示。

公共类MyDbContext:DbContext
{
公共数据库集作者{get;set;}
公共数据库集书籍{get;set;}
公共数据库查询AuthorBookCounts{get;set;}
配置时受保护的覆盖无效(DBContextOptions Builder Options Builder)
{
//设置cnxn字符串
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Query().ToQuery(()=>
Query().FromSql(@“选择不同的(Authors.FIRST_NAME+”)
Authors.LAST_NAME)作为AUTHOR_全名,从Authors中计数(Books.Id)
加入Books ON Books.AUTHOR\u ID=Authors.ID分组依据(Authors.FIRST\u NAME+“”+
作者(姓);
}
}
这解决了我在上面遇到的具体错误。我在学习过程中学到了一些重要的东西。如果你经常使用EF,这些东西应该是不言自明的

  • SQL语句必须为要将语句映射到的实体对象模型中的每个属性返回一个值
  • 对象实体属性必须正确映射到SQL语句中返回的字段名
  • 我希望这篇文章能帮助其他人的努力。我发现朱莉·勒曼的《实体框架核心2.1:PluralSight上的新剧本是什么》这门课程很有帮助