【问题标题】:EF Core - Populate an UnMapped column from raw SQL?EF Core - 从原始 SQL 填充未映射的列?
【发布时间】:2020-09-07 01:21:34
【问题描述】:

我有一个查询,我正在对特定连接/列进行计数 - 如果我运行此代码并删除了“Clicks”[NotMapped] 属性,则所有值都会正确填充 - 但随后插入失败,因为“Clicks " 不是有效的列名。当我将该列标记为 [NotMapped] 时,它不会从此语句中填充。 如何使用原始 SQL 并填充 [NotMapped] 列?

代码:

var query = db.URLs.FromSqlRaw(
        @"SELECT [u].[Key], [u].[Url], COUNT(c.Id) AS [Clicks]
          FROM[URLs] AS[u]
          LEFT JOIN[Clicks] AS[c] ON[u].[Key] = [c].[ShortUrlKey]
          GROUP BY[u].[Key], [u].[Url]")
          .AsQueryable<ShortURL>();

            var urls = query.ToList();

模型(适用于插入,但不填充 Clicks 属性):

public class ShortURL
{
    public string Key { get; set; }
    public string Url { get; set; }

    [NotMapped()]
    public int Clicks { get; set; } // doesn't populate from raw query
}

模型(适用于查询,但插入失败)

    public class ShortURL
{
   public string Key { get; set; }
   public string Url { get; set; }
   public int Clicks { get; set; } // not in DB
}

【问题讨论】:

标签: entity-framework-core ef-code-first ef-core-3.1


【解决方案1】:

这不是最好的方法,但可以用来解决您的问题:

  1. 在您的 DBContext 列表中创建一个新的 DbSet:

    public DbSet&lt;YourMode&gt; actual_table_name { get; set; }

    public DbSet&lt;CopyWithUnmappedModel&gt; arbitary_table_name { get; set; }

  2. 在 YourModel 下复制整个 YourModel 并给它起任何你想要的名字 (CopyWithUnmappedModel)

  3. 移除所有 NotMapped 字段,并将它们放置在具有 NotMapped 属性的任意模型中

  4. 在您只想读取日期的地方使用 arbitary_table_name 而不是 actual_table_name。由于您没有写入表,因此表的名称并不重要。并使用第一个 actual_table_name 进行书写。

【讨论】:

    猜你喜欢
    • 2012-04-15
    • 2015-01-13
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多