c# - 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);
});
解决方案
实体框架不支持原始类型的集合。您可以创建一个实体(将保存到不同的表中)或进行一些字符串处理以将您的列表保存为字符串并在实体具体化后填充列表。
您已将所有列创建为字段。不是属性。(使它们成为属性)即
公共类型名称 propName {get;set;}
然后运行迁移或命令。
推荐阅读
- java - 如何在不使用 for 循环的情况下将多个列表中的每个项目映射到 Java 中的对象中
- reactjs - 是否可以在不创建为 Web 部件的情况下在线创建反应应用程序并在共享点中部署?
- visual-studio - Visual Studio 将 Azure DevOps 服务器(本地)添加为符号服务器
- typescript - 接口中的打字稿接口
- java - 如何在 Java/Android 中实现多用户应用程序?
- javascript - 动作分派后组件中的 Redux 状态未更新,但显示在 redux devtools 中
- javascript - 带有垂直线的进度条
- c# - 查询Json如何获取必须数组中的元素
- amazon-web-services - 错误:模块参数的值无效给定的值不适合子模块变量
- botframework - 从个人范围事件中添加或删除的 Microsoft Teams 应用程序丢失