我有包含以下列的表:
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
获取字段名称,但是我正在寻找一种更简单的方法。
如何重新设计实体?
答案 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);