来自非关系数据库的 EF Core 5.0 关系数据库

问题描述

问题来了。

我有一个来自旧 COBOL 软件(txt 文件)的古老数据库。

我想要的

  • 关联下面列出的对象,而不更改原始数据。

背景

DB 是 MS-SQL。每个导入的对象都有一个唯一的 id(数据库生成)。在旧 COBOL 软件中实际组合对象的“外键”(“NonUniqueItemProperty”)并不是唯一的。 (这就是为什么我不能在表之间创建关系)

我的问题是,这可能吗?

目前我在查询时加入表

select item.*,owner.* from Items item
INNER JOIN Ownership ownership on item.NonUniqueItemProperty=ownership.NonUniqueItemProperty
INNER JOIN Owner owner on ownership.OwnerIdNo=owner.OwnerIdNo

这个查询返回一个匹配(item-->ownerCount)*(item-->count)的结果集。然后我使用 linq 按 Item.NonUniqueItemProperty 对它们进行分组,并为每个 Item 设置所有者。

对象:

    public class Item
    {
        pullic int Id {get;set;} // database generated,non-related to original data
        public string NonUniqueItemProperty {get;set;} //sadly this is the identifier
        public virtual ICollection<Ownership> Ownerships { get; set; }
    }
    
    public class Ownership
    {
        pullic int Id {get;set;} // database generated,non-related to original data
        public virtual Item Item { get; set; }
        public virtual Owner Owner { get; set; }
        public string NonUniqueItemProperty {get;set;}
        public string OwnerIdNo {get;set;}
    }
    
    public class Owner
    {
        pullic int Id {get;set;} // database generated,non-related to original data
        public virtual ICollection<Ownership> Ownerships { get; set; }
        public string OwnerIdNo {get;set;}
    }

我尝试在 fluent api 中创建关系:

    item.HasMany<Ownership>(i => i.Ownerships)
                .WithOne(ow => ow.Item)
                .HasPrincipalKey(i=>i.NonUniqueItemProperty)
                .HasForeignKey(ow=>ow.NonUniqueItemProperty);

就目前而言,没有错误,但导航属性为空。

编辑

此后,我意识到此表达式返回一个具有空所有权导航的 Item 实体。结果集返回我正在寻找的内容,因此导航可用于过滤项目集!

var resultSet = ctx.Items.Where(
             i => i.Ownerships.Any(
                     ow => ow.Owner.OwnerIdNo=="P12345"));

解决方法

我设法通过 Eager Loading 获得了导航属性 Here

通过在查询末尾添加 Include(i=>i.Ownership).ThenInclude(ow=>ow.Owner)

但根据两位领域专家的建议,这不应该起作用,我不会在代码中实现它,这在更高版本的 EF 中不起作用。

编辑

这是一个真正的性能杀手!通过编写上面的 sql-query,TOP 150 Items 消耗 120-150 毫秒,这个是 2.500-4.000 毫秒(query.Take(100))。

(项目数:350K, 所有权数:390K)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...