【问题标题】:Table with with different fields depending on category根据类别具有不同字段的表
【发布时间】:2019-05-04 18:08:08
【问题描述】:

我有包含这些列的表:

Id
Title
Description
CreateDateTime
CategoryId
Picture
quantity
Price
RentPrice
WantToExchange
NumberOfRoom
DepositPrice

每行只需要前 6 个,其他列将根据实体类别为空。

例如在cat1中只有前6个字段和Price由用户填充,而在cat2中只有前6个字段和RentPrice, DepositPrice被填充,所以一段时间后表格行的许多列变为空

我在 NopCommerce 源代码中看到了一些解决方案,用于以不同语言存储各种产品属性 - 有实体名为 LocalizedProperty 和 storeEntityId、LanguageId、实体名称、字段名称及其值
it use

Expression<Func<T, TPropType>>

PropertyInfo 获取字段名称,但我正在寻找一种更简单的方法。 如何重新设计我的实体?

【问题讨论】:

标签: entity-framework database-design


【解决方案1】:

如果您已经设计了面向对象,您可能会创建一个 PictureDescription 类和一个 PicturePrice 类,它们将具有其他属性。

每个 PictureDescription 将零个或一个 PicturePrice 对象:一个简单的聚合

如果您想在关系数据库中使用 0 或 1,那么这通常使用两个表来完成,其中一个表的外键指向另一个表。

Entity Framework zero-or-one-to-one

class PictureDescription
{
    public int Id {get; set;}
    public string Title {get; set;}
    ...

    // every PictureDescription has zero or one PicturePrice
    public virtual PicturePrice PicturePrice {get; set;}
}

class PicturePrice
{
    public int Id {get; set;}
    public decimal Price {get; set;}
    ...

    // every PicturePrice belongs to exactly one Picture, using foreign key
    public int PictureDescriptionId {get; set;}
    public virtual PictureDescription PictureDescription {get; set;}
}

这足以让实体框架检测您的列和表之间的关系。如果你想使用 fluent API,在 DbContext.OnModelCreating 中:

// every PictureDescription has zero or one PicturePrice:
modelBuilder.Entity<PictureDescription>()
    .HasOptional(description => description.PicturePrice)
    .WithRequired(price => price.PictureDescription)
    .HasForeignKey(price => price.PictureDescriptionId);

【讨论】:

  • 感谢您的重播,但是图片没有问题,您可能没有很好地理解我的问题,我的问题是某些行没有包含所有这些文件,例如有很多行hase Price,但不是 RentPrice 也不是 WantToExchange,并且该字段在表中变为空
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 2019-05-26
  • 2020-09-03
  • 1970-01-01
  • 2021-05-08
相关资源
最近更新 更多