首页 > 解决方案 > Table-per-hierarchy 表缺少子类型的列

问题描述

我有一个问题,在 EF Core 中使用 Table Per Hierarchy 时,为超类型创建的数据库表VeganItem没有RecipeItem子类型列:servesCount, cookTime, prepTime, method, tips, 。ingredients

超级类型:

[Serializable]
public abstract class VeganItem : DomainEntity<int>
{
    [Required]
    public string Name { get; set; }
    [Required]
    public string CompanyName { get; set; }
    public string Description { get; set; }
    [Required]
    public int IsNotVeganCount { get; set; } = 0;
    [Required]
    public int IsVeganCount { get; set; } = 0;
    [Required]
    public int RatingsCount { get; set; } = 0;
    [Required]
    public int Rating { get; set; }
    public List<Option> Tags { get; set; }
    [MaxLength(10)]
    public List<String> Images { get; set; }
}

public abstract class VeganItem<TVeganItemEstablishment> : VeganItem 
    where TVeganItemEstablishment : VeganItemEstablishment
{
    [PropertyName("veganItemEstablishments", Ignore = true)]
    public virtual ICollection<TVeganItemEstablishment> VeganItemEstablishments { get; set; }
}

子类型:

[ElasticsearchType(RelationName = "recipeitem", IdProperty = "Id")]
public class RecipeItem : VeganItem<RecipeItemEstablishment>
{
    [Required]
    public int servesCount;
    [Required]
    public TimeSpan cookTime;
    [Required]
    public TimeSpan prepTime;
    [Required]
    public Option difficulty;
    [Required]
    [MaxLength(100)]
    public List<string> method;
    [Required]
    [MaxLength(2)]
    public List<string> tips;
    [Required]
    [MaxLength(100)]
    public List<string> ingredients;
}

模型构建器:

modelBuilder.Entity<RecipeItem>(veganItem =>
{
    veganItem.Property(e => e.difficulty)
        .HasConversion(
            v => JsonSerializer.Serialize(v, null),
            v => JsonSerializer.Deserialize<Option>(v, null)
        );
});

modelBuilder.Entity<VeganItem>(veganItem =>
{
    veganItem.HasIndex("CompanyName", "Name", "Discriminator").IsUnique();
    veganItem.HasDiscriminator<string>("Discriminator");
    veganItem.Property(u => u.CreatedDate)
        .HasDefaultValueSql("CURRENT_TIMESTAMP"); 
    veganItem.Property(u => u.UpdatedDate)
        .HasDefaultValueSql("CURRENT_TIMESTAMP"); 
    veganItem.HasKey(e => e.Id);
    veganItem.HasOne(q => q.UpdatedBy)
        .WithMany()
        .HasForeignKey(k => k.UpdatedById);
    veganItem.HasOne(q => q.CreatedBy)
        .WithMany()
        .HasForeignKey(k => k.CreatedById);
    veganItem.Property(e => e.Tags)
        .HasConversion(
            v => JsonSerializer.Serialize(v, null),
            v => JsonSerializer.Deserialize<List<Option>>(v, null)
        );
});

public DbSet<VeganItem> VeganItems { get; set; }     
public DbSet<RecipeItem> RecipeItems { get; set; }

它为difficulty. 我想是因为该属性在数据上下文中有一个值转换器。

知道如何让问题顶部提到的字段出现在数据库表中吗?

编辑:这使它起作用-我只是认为没有必要

modelBuilder.Entity<RecipeItem>(veganItem =>
{
    veganItem.Property(e => e.Difficulty)
        .HasConversion(
            v => JsonSerializer.Serialize(v, null),
            v => JsonSerializer.Deserialize<Option>(v, null)
        );

    veganItem.Property(e => e.Tips);
    veganItem.Property(e => e.ServesCount);
    veganItem.Property(e => e.CookTime);
    veganItem.Property(e => e.PrepTime);
    veganItem.Property(e => e.Method);
    veganItem.Property(e => e.Ingredients);
});

标签: c#entity-framework-core.net-5asp.net5

解决方案


实体框架不支持原始类型的集合。您可以创建一个实体(将保存到不同的表中)或进行一些字符串处理以将您的列表保存为字符串并在实体具体化后填充列表。

  • 您已将所有列创建为字段。不是属性。(使它们成为属性)即

    公共类型名称 propName {get;set;}

然后运行迁移或命令。


推荐阅读