【问题标题】:FromSql with Non-Existing EntityFromSql 与不存在的实体
【发布时间】:2019-09-17 23:12:51
【问题描述】:

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

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

这里是实体对象模型。在此示例中,AuthorBook 是表,AuthorBookCount 是自定义 SQL 查询的对象模型,没有要映射到的相应视图或表。

public class Author
{
    [Column("ID")]
    public int Id { get; set; }

    [Column("FIRST_NAME")]
    public string FirstName { get; set; }

    [Column("LAST_NAME")]
    public string LastName { get; set; }
}

public class Book
{
    [Column("ID")]
    public int Id { get; set; }

    [Column("AUTHOR_ID")]
    public int AuthorId { get; set; }

    [Column("TITLE")]
    public string Title { get; set; }
}

public class AuthorBookCount
{
    [Column("AUTHOR_FULL_NAME")]
    public string AuthorFullName { get; set; }

    [Column("BOOK_COUNT")]
    public long BookCount { get; set; }
}

然后我像这样设置DbContext

public class MyDbContext : DbContext
{
    public DbSet<Author> Authors { get; set; }

    public DbSet<Book> Books { get; set; }

    public DbQuery<AuthorBookCount> AuthorBookCounts { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        //Set up cnxn string
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Query<AuthorBookCount>().ToQuery(() =>
            AuthorBookCounts.FromSql("SELECT DISTINCT(Authors.FIRST_NAME + ' ' + Authors.LAST_NAME) AS AUTHOR_FULL_NAME, COUNT(Books.Id) FROM Authors JOIN Books ON Books.AUTHOR_ID = Authors.ID GROUP BY (Authors.FIRST_NAME + ' ' + Authors.LAST_NAME)");
    }
}

现在,当我尝试使用我的 AuthorBookCounts 属性时,我收到一个 SystemNotSupported 异常,并显示一条消息,指出当前不支持 FromSql。

我将我的FromQuery SQL 调用更改为 LINQ 查询,它可以正常工作。这个解决方案的问题是我的 SQL 调用非常复杂,不断将我的 SQL 转换为 LINQ 语句是一个巨大的痛苦。

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

【问题讨论】:

    标签: entity-framework-core


    【解决方案1】:

    像所有大问题一样,解决这个问题的方法非常简单。在ToQuery 方法中,将对DbQuery&lt;AuthorBookCount&gt; 属性AuthorBookCounts 的引用替换为另一个Query&lt;T&gt; 引用,就像这样。

    public class MyDbContext : DbContext
    {
        public DbSet<Author> Authors { get; set; }
    
        public DbSet<Book> Books { get; set; }
    
        public DbQuery<AuthorBookCount> AuthorBookCounts { get; set; }
    
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            //Set up cnxn string
        }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Query<AuthorBookCount>().ToQuery(() =>
                Query<AuthorBookCount>().FromSql(@"SELECT DISTINCT(Authors.FIRST_NAME + ' ' + 
                Authors.LAST_NAME) AS AUTHOR_FULL_NAME, COUNT(Books.Id) FROM Authors 
                JOIN Books ON Books.AUTHOR_ID = Authors.ID GROUP BY (Authors.FIRST_NAME + ' ' + 
                Authors.LAST_NAME)");
        }
    }
    

    这解决了我上面遇到的特定错误。一些重要的事情要注意,我在此过程中学到了。如果您经常使用 EF,这些事情应该是不言自明的。

    1. SQL 语句必须为您将语句映射到的实体对象模型中的每个属性返回一个值。
    2. 对象实体属性必须正确映射到 SQL 语句中返回的字段名称。

    我希望这篇文章对其他人的努力有所帮助。我发现有帮助的一门课程是 Julie Lerman 的 Entity Framework Core 2.1:PluralSight 上提供的新剧本。

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      相关资源
      最近更新 更多