【问题标题】:Entity Framework 6 Table per Hierarchy (TPH) bugEntity Framework 6 Table per Hierarchy (TPH) 错误
【发布时间】:2014-07-23 12:51:45
【问题描述】:

我创建了一个带有一些基本属性的抽象类:

public abstract class BaseModel
{
    public BaseWishModel()
    {
    }

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

    public virtual string Title { get; set; }

    public bool IsPublished { get; set; }
    public bool IsSpam { get; set; }
}

我的物品类别:

public class PrivateItem : BaseModel
{
    [NotMapped]
    public string PurposesIds { get; set; }
}

我的 OnModelCreating 方法:

  modelBuilder.Entity<BaseModel>()
             .Map<PrivateItem>(r => r.Requires("Discriminator").HasValue((int)Enums.Type.Private))
             .ToTable("Items");

当我保存数据时,它会生成下一个 sql:

INSERT [dbo].[Items]([Title], [IsPublished], [ShortDescription1], [ShortDescription2], [Discriminator])

我不知道它为什么会生成 ShortDescription1 和 ShortDescription1

【问题讨论】:

  • 是的,我有。这是一个映射` modelBuilder.Entity() .Map(r => r.Requires("Discriminator").HasValue((int)Enums.Type.Private)) .Map(r => r.Requires("Discriminator").HasValue((int)Enums.Type.Public)) .Map(r => r.Requires("Discriminator").HasValue((int)Enums.Type.其他)) .ToTable("项目"); ` 我只提交了一个特定类别的插入。为什么会这样?
  • Stack Overflow 允许您根据需要多次更新您的问题。请使用相关代码更新您的问题,以便其他阅读您问题的人不必阅读每条评论即可理解完整问题(并允许对代码进行格式化以便于阅读)。

标签: entity-framework ef-code-first table-per-hierarchy


【解决方案1】:

因为,根据您的评论,您还有其他类继承自 BaseModel,并且您没有其他配置,EF 默认使用 TPH

基本上这会导致所有类层次结构的单个表。

当一个类的插入完成时,层次结构的所有类都保存在同一个表中,因此(层次结构的)所有列都会被填充。类列使用的非由 null 或默认值填充。

这会将 ShortDescription1 和 ShortDescription2 带入您的插入查询中。

【讨论】:

  • 我正在尝试将我的所有课程指向同一张桌子。根据实体框架指南,我可以创建鉴别器来区分映射到同一张表的类
  • 很抱歉造成混淆,但我已经创建了 Discriminator 属性,但仍然出现错误
  • 你能给我一个正确执行我的请求的例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
相关资源
最近更新 更多