gpt4 book ai didi

c# - EntityFramework 代码优先继承,在派生类上具有急切的包含关系

转载 作者:太空宇宙 更新时间:2023-11-03 14:58:30 25 4
gpt4 key购买 nike

我不认为使用 TPH 或 TPT 继承方法对此有影响。

我的目标是使用一种方法从数据库中加载所有内容,其中包含混合类型的实体,这些实体可能具有不同的关系,具体取决于类型。

让我们采用这个代码优先模型(代表我的问题的简单模型):

public abstract class Entity
{
public int ID { get; set; }
public string Name { get; set; }
}

public abstract class EntityWithInfo : Entity
{
public AdditionalInformation Info { get; set; }
}

public class DerivedEntityWithInfo : EntityWithInfo
{
}

public class DerivedEntityWithInfo2 : EntityWithInfo
{
}

public class DerivedEntityWithoutInfo : Entity
{
}

public class AdditionalInformation
{
public int ID { get; set; }
public int SomeProperty { get; set; }
}

以及 Fluent API 配置:

modelBuilder.Entity<Entity>()
.HasKey(e => e.ID)
.Map<DerivedEntityWithInfo>(m => m.Requires("Type").HasValue(1)
.Map<DerivedEntityWithInfo2>(m => m.Requires("Type").HasValue(2)
.Map<DerivedEntityWithoutInfo>(m => m.Requires("Type").HasValue(3);

modelBuilder.Entity<EntityWithInfo>()
.HasRequired(e => e.Info)
.WithRequiredPrincipal()
.Map(e => e.MapKey("Entity_FK"));

modelBuilder.Entity<AdditionalInformation>()
.HasKey(e => e.ID);

或者视觉上: Visual

SQL 模式很简单:

Table Entity with: Id, Type, Name
Table AdditionalInformation with: Id, SomeProperty, Entity_FK

现在,我希望能够执行如下操作:

context.Entity.Where(t => t.ID = 304 || t.ID = 512).ToList();

这为我提供了所有实体的正确列表,并且输入正确。但是,Info 属性当然始终为空。禁用 LazyLoading 和删除 virtual 也不会强制加载它,据我所知,我绝对需要在那里有一个 .Include(t => t.Info) 行。

我知道我可以打电话

context.Entity.OfType<EntityWithInfo>().Include(t => t.Info).Where(t => t.ID = 304 || t.ID = 512).ToList();

但是我将只获得从 EntityWithInfo 派生的实体,而不是 DerivedEntityWithoutInfo 的实体。

那么让我们尝试使用联合:

context.Entity.OfType<EntityWithInfo>().Include(t => t.Info).Cast<Entity>()
.Union(context.Entity.OfType<DerivedEntityWithoutInfo>().Cast<Entity>())
.Where(t => t.ID == 719 || t.ID == 402);

这不起作用,它告诉我“实体未声明导航属性信息”。

而且,我猜这会创建一个糟糕的 SQL 查询。

事实上,我这样做的真正原因是因为一个非常古老的项目使用 LINQ2SQL 做等效的“LoadWith”选项生成滥用 SQL 查询(为每个继承的连接复制关系表类型)。加载单个实体比加载没有层次结构的原始元素的整个表要花费更多的时间。所以我想看看移植到 EntityFramework 是否会生成更优化的 SQL 查询。

那么,有没有办法做到这一点,或者我们只是想以错误的方式做事?这似乎不是一种同时具有继承、派生类关系和预加载的非常流行的方法,因为我在网上几乎找不到任何资源。

此时,如有任何关于如何从该数据库模型创建该对象模型的建议,我们将不胜感激。谢谢

最佳答案

这现在在 EF Core 2.1 中得到支持.现在看看生成的查询是否对性能要求不高。

关于c# - EntityFramework 代码优先继承,在派生类上具有急切的包含关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47583318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com