为多个表创建一个实体?

问题描述 投票:0回答:1

我的情况是,我的 SQL 数据库中有几个表,我想使用实体框架进行查询。我不想为每个表拥有一个单独的实体,而是希望拥有一个包含所有表中所有列的属性的实体。当我尝试执行此操作时,最终出现 System.InvalidOperationException:“‘FromSql’操作的结果中不存在所需的列。”

这基本上是我的表格的样子:

表 #1 列:Column1、Column2、Column3
表 #2 列:第 3 列、第 4 列、第 5 列
表 #3 列:第 3 列、第 4 列、第 6 列

这基本上就是我的实体的样子:

public class UniversalEntity
{
    public string? Column1 {get; set;}
    public string? Column2 {get; set;}
    public string? Column3 {get; set;}
    public string? Column4 {get; set;}
    public string? Column5 {get; set;}
    public string? Column6 {get; set;}
}

这基本上就是我的 DbContext 的样子:

public class MyContext : DbContext
{
    public DbSet<UniversalEntity>? Universals {get; set;}

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer([My Database Connection String]);
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        var entityTypeBuilder = modelBuilder.Entity<UniversalEntity>().HasNoKey();

        entityTypeBuilder.Property(p => p.Column1).IsRequired(false);
        entityTypeBuilder.Property(p => p.Column2).IsRequired(false);
        entityTypeBuilder.Property(p => p.Column3).IsRequired(false);
        entityTypeBuilder.Property(p => p.Column4).IsRequired(false);
        entityTypeBuilder.Property(p => p.Column5).IsRequired(false);
        entityTypeBuilder.Property(p => p.Column6).IsRequired(false);
    }
}

这本质上就是我查询表的方式:

MyContext context = new MyContext();
List<UniversalEntity>? results = context.Universals.FromSqlRaw("RAW SQL QUERY").ToList();

例如,如果我查询表#2,那么我得到的错误如下所示:

System.InvalidOperationException: 'The required column 'Column1' was not present in the results of a 'FromSql' operation.'

我认为在 OnModelCreating 中使用

entityTypeBuilder.Property(p => p.ColumnX).IsRequired(false);
会阻止需要列,但这似乎不起作用。

是否可以创建一个具有不需要通过调用 FromSqlRaw 来填充的属性的实体?如果是这样,怎么办?我目前正在使用 EF Core 7,但如有必要,我愿意切换版本。

我的所有查询也是严格只读的。没有查询需要写入表。

c# sql-server entity-framework-core
1个回答
0
投票

您可以创建一个数据库视图来合并多个表中的列,然后使用实体框架查询该视图。

创建数据库视图:

CREATE VIEW YourEntity AS
SELECT Column1, Column2, Column3, Column4, Column5, Column6
 FROM Table1
   UNION ALL
SELECT NULL AS Column1, NULL AS Column2, Column3, Column4, Column5, NULL AS Column6
 FROM Table2
   UNION ALL
SELECT NULL AS Column1, NULL AS Column2, Column3, Column4, NULL AS Column5, Column6
 FROM Table3;

将视图映射到实体:

public class YourEntity
{
    public string? Column1 { get; set; }
    public string? Column2 { get; set; }
    public string? Column3 { get; set; }
    public string? Column4 { get; set; }
    public string? Column5 { get; set; }
    public string? Column6 { get; set; }
}

查询视图:

MyContext context = new MyContext();
List<YourEntity>? results = context.Your.FromSqlRaw("SELECT * FROM YourEntity").ToList();
© www.soinside.com 2019 - 2024. All rights reserved.