每个层次结构表缺少子类型的列[已关闭]

问题描述 投票:0回答:1

我遇到一个问题,为超类型

VeganItem
创建的数据库表没有
RecipeItem
子类型列:
servesCount
cookTime
prepTime
method
tips
、在 EF Core 中使用 Table Per Hierarchy 时,其中包含
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
创建一列。我想是因为该属性在数据上下文中有一个值转换器。

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

c# asp.net-core entity-framework-core .net-5
1个回答
0
投票

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

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

    public TypeName propName {get;set;}

然后运行迁移或命令。

© www.soinside.com 2019 - 2024. All rights reserved.