gpt4 book ai didi

entity-framework - Entity Framework TPC 的多重继承

转载 作者:行者123 更新时间:2023-12-04 23:25:30 25 4
gpt4 key购买 nike

我尝试使用 TPC 样式的 Entity Framework 映射一些类,但出现以下错误:

Error: The type 'A' cannot be mapped as defined because it maps inherited properties from types that use entity splitting or another form of inheritance. Either choose a different inheritance mapping strategy so as to not map inherited properties, or change all types in the hierarchy to map inherited properties and to not use splitting.



当我使用以下类时会发生此错误:
public abstract class BaseEntityTest
public abstract class BaseEntityTest2 : BaseEntityTest
public abstract class BaseEntityTest3 : BaseEntityTest2
public class A: BaseEntityTest3 // this class is the only one with a table in the db

在 OnModelCreating 方法中,我添加了以下代码以获取 TPC 映射
modelBuilder.Entity<A>().Map(m =>
{
m.MapInheritedProperties();
m.ToTable("A");
});

当我从结构中排除 BaseEntityTest2 时(以便 A 仅从 BaseEntityTest 而不是 BaseEntityTest2 继承),错误消失了。这是否意味着无法创建此映射,或者我只是错过了什么?

编辑:

类的属性:
public abstract class BaseEntityTest
{

[Key]
public Guid Id { get; set; }

public String Info { get; set; }

[Required]
public DateTime CreationDate { get; set; }

[Required]
public String CreationUser { get; set; }

[Required]
public DateTime ModificationDate { get; set; }

[Required]
public String ModificationUser { get; set; }

[ConcurrencyCheck]
[Required]
public int LockVersion { get; internal set; }
}

public abstract class BaseEntityTest2 : BaseEntityTest
{
[Required]
public string Name { get; set; }

public string Description { get; set; }

}

public abstract class BaseEntityTest3: BaseEntityTest2
{

[Required]
public DateTime FromDate { get; set; }

public DateTime ThruDate { get; set; }
}

public class A: BaseEntityTest3{
public String Test { get; set; }
}

最佳答案

EF 4.3.1 及更早版本会出现此错误,但 EF 4.4 和 EF 5.0 不会出现此错误。 (EF 4.4 实际上是 EF 5.0,但以 .NET 4.0 作为目标平台。)

但是:仅当您将抽象类用作模型中的实体时才会发生错误,这意味着

  • 你要么有 DbSet在你的上下文类中为他们,比如
    public DbSet<BaseEntityTestX> BaseEntityTestXs { get; set; }
  • 或者您有一些适用于 BaseEntityTestX 的 Fluent 映射, 一些 modelBuilder.Entity<BaseEntityTestX>()...东西
  • 或者您正在使用 BaseEntityTestX 之一作为另一个(具体)实体类型中的导航属性

  • 你需要这些吗?

    有一个 DbSet<BaseEntityTestX>在您的上下文中,只有当您真的想查询抽象实体之一时才有意义,例如:
    List<BaseEntityTest> list = context.BaseEntityTests
    .Where(b => b.Info == "abc").ToList();

    结果当然是从 BaseEntityTest 继承的具体实体的列表。 ,但它可以是不同类型的混合,比如一些 A s 和一些 B s。你需要这样的查询吗?或者你只想查询一些具体的对象:
    List<A> list = context.As
    .Where(b => b.Info == "abc").ToList();

    在后一种情况下,您不需要 DbSet对于抽象基类,您不需要任何继承映射。您可以删除 DbSet<BaseEntityTestX>从您的上下文类中删除 TPC 映射,您的错误就会消失。

    最后一点 - 具有指向另一个实体中一个抽象实体的导航属性 - 对 TPC 映射没有意义。它只是不能映射到关系数据库,因为 TPC 映射没有抽象实体的表,因此外键关系没有可以从具有导航属性的具体类的表中引用的目标。

    如果将 TPC 映射扩展到基类,错误也会消失:
    modelBuilder.Entity<BaseEntityTestX>().Map(m =>
    {
    m.MapInheritedProperties();
    m.ToTable("BaseEntityTestX");
    });

    但它会为那些对我来说似乎没有意义的抽象实体创建表格。

    关于entity-framework - Entity Framework TPC 的多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13540976/

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