【问题标题】:C# MVC Code First Complex ModelC# MVC 代码优先复杂模型
【发布时间】:2014-08-17 18:15:50
【问题描述】:

我有一个“广告”表,它存储有关广告的基本信息(例如:名称、摘录、创建日期...),我需要将更详细的信息存储在一个单独的表中,但是,这是我的问题。广告可能因类型(出售、购买、出租......)、类别(住宅、商业......)而不同,因此,详细信息也不同(例如:商业广告不需要厨房区域属性)。我想制作一些模型来描述特定类型或类别的详细信息

这是我的广告模型:

[Table("Adverts_Adverts")]
public class Advert {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid AdvertId { get; set; }

    public virtual Metadata Metadata { get; set; }

    [Required]
    [DataType(DataType.Text)]
    public String Name { get; set; }

    [DataType(DataType.Html), AllowHtml]
    public String Content { get; set; }

    [ForeignKey("Section")]
    public Guid SectionId { get; set; }
    public virtual Section Section { get; set; }

    [ForeignKey("Category")]
    public Guid CategoryId { get; set; }
    public virtual Category Category { get; set; }

    [ForeignKey("Type")]
    public Guid TypeId { get; set; }
    public virtual Type Type { get; set; }

    public Decimal Price { get; set; }

    [DataType("Enum")]
    public Currency Currency { get; set; }

    [ForeignKey("Details")]
    public Guid DetailsId { get; set; }
    public virtual ?????????? Details { get; set; }

    [ForeignKey("User")]
    public String UserId { get; set; }
    public virtual User User { get; set; }

    [ReadOnly(true)]
    [DataType(DataType.DateTime)]
    public DateTime Added { get; set; }

    [ReadOnly(true)]
    [DataType(DataType.DateTime)]
    public DateTime Updated { get; set; }

    public Int32 Views { get; set; }

    [ReadOnly(true)]
    public Status Status { get; set; }

    ...
}

这是我的住宅广告详细信息模型:

[Table("Adverts_Details")]
public class ResidentialDetails {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid DetailsId { get; set; }

    [ForeignKey("Advert")]
    public Guid AdvertId { get; set; }
    public virtual Advert Advert { get; set; }

    [Required]
    public Int32 Storeys { get; set; }

    [Required]
    public Int32 Floor { get; set; }

    [Required]
    public Int32 Rooms { get; set; }

    [Required]
    public Decimal TotalArea { get; set; }

    [Required]
    public Decimal LivingArea { get; set; }

    [Required]
    public Decimal KitchenArea { get; set; }

    ...
}

这可能用于商业广告:

[Table("Adverts_Details")]
public class CommercialDetails {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid DetailsId { get; set; }

    [ForeignKey("Advert")]
    public Guid AdvertId { get; set; }
    public virtual Advert Advert { get; set; }

    [Required]
    public Int32 OfficesCount { get; set; }

    [Required]
    public Int32 Floor { get; set; }

    [Required]
    public Decimal TotalArea { get; set; }

    ...
}

那么,我如何访问广告属性“详细信息”中的 ResidentialDetails 和 CommercialDetails 数据?

(提前致谢)

【问题讨论】:

  • 你描述你追求的东西的方式不清楚。也许向我们展示一个您希望能够对您的代码做什么的示例,并解释您对代码的哪一部分感到困惑?
  • 对不起我的英语,我添加了一个例子

标签: c# asp.net-mvc model-view-controller modeling


【解决方案1】:

这是一个架构问题,如果不完全了解您的业务规则,就很难回答。我可以给你一些一般性的建议,希望对你有所帮助。

尽可能地消除复杂性。我不确定什么是“厨房区域财产”,但你能概括一下吗?根据上下文,您可以将其称为不同的名称,以不同的方式使用它等等,但如果它只是一个文本字段,那么您可以在其他上下文中重新调整它的用途。住宅广告可能是“厨房区”,而商业广告可能是“休息室区”。 (我真的不知道这个属性是干什么用的,但我只是想说明同一个属性在不同的上下文中可以具有相似但略有不同的含义)。

如果您不能概括,那么您需要开始研究继承策略。创建对象图。这些类型和类别的广告如何相关。他们有什么不同。哪些是其他人的超群,等等?同样,我对正在使用的业务规则一无所知,但也许您需要像 AdvertResidentialAdvert : AdvertCommercialAdvert : Advert 这样的类。然后,您可以根据需要向这些子类添加其他属性。

您还需要决定关系策略。默认情况下,EF 会将简单继承实现为 STI(单表继承,也称为每层次表或简称 TPH)。换句话说,使用上面的类,您最终会得到一个带有Discriminator 列的Adverts 表。此列的值将是“Advert”、“ResidentalAdvert”或“CommercialAdvert”之一,指示应实例化哪个类,但所有子类的所有列都将驻留在同一个表中。好处是不需要连接,但坏处是子类上的所有其他列都必须可以为空或具有默认值。其他可能的策略包括每个类型的表 (TPT)、组合策略或每个具体类型的表 (TPC),其中每个子类型都有自己的唯一表,其中包含所有超类型的所有字段。

【讨论】:

  • tnx Chris,“你最终会得到一个带有鉴别器列的 Adverts 表”我在 Identity 2.x 中看到了这一点,我会尝试......但需要了解更多信息;)跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
相关资源
最近更新 更多