根据类别具有不同字段的表

时间:2018-12-03 12:30:17

标签: entity-framework database-design

我有包含以下列的表:

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获取字段名称,但是我正在寻找一种更简单的方法。 如何重新设计实体?

1 个答案:

答案 0 :(得分:0)

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

每个PictureDescription都会拥有零个或一个PicturePrice对象:简单的聚合

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

请参见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;}
}

对于实体框架而言,这足以检测您的列和表之间的关系。如果要使用流利的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);