Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#MVC代码优先复杂模型_C#_Asp.net Mvc_Model View Controller_Modeling - Fatal编程技术网

C#MVC代码优先复杂模型

C#MVC代码优先复杂模型,c#,asp.net-mvc,model-view-controller,modeling,C#,Asp.net Mvc,Model View Controller,Modeling,我有一个表“广告”,其中存储了有关广告的基本信息(例如:名称、摘录、创建日期…),我需要在一个单独的表中存储更详细的信息,但是,这是我的问题。广告可以根据类型(出售、购买、租赁等)、类别(住宅、商业等)而有所不同,因此,详细信息也不同(例如:商业广告不需要厨房区域的财产)。我想做几个模型来描述特定类型或类别的详细信息 以下是我的广告模型: [Table("Adverts_Adverts")] public class Advert { [Key] [DatabaseGenerat

我有一个表“广告”,其中存储了有关广告的基本信息(例如:名称、摘录、创建日期…),我需要在一个单独的表中存储更详细的信息,但是,这是我的问题。广告可以根据类型(出售、购买、租赁等)、类别(住宅、商业等)而有所不同,因此,详细信息也不同(例如:商业广告不需要厨房区域的财产)。我想做几个模型来描述特定类型或类别的详细信息

以下是我的广告模型:

[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; }

    ...
}
这可能用于商业广告:

[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; }

    ...
}
那么,我如何访问广告财产“详细信息”中的数据,包括住宅详细信息和商业详细信息


(提前感谢)

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

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

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


您还需要决定关系策略。默认情况下,EF将以STI(单表继承,简称table per hierarchy或TPH)的形式实现简单继承。换句话说,使用上面的类,您将得到一个带有
鉴别器列的
广告
表。此列的值将是“Advert”、“residentadvert”或“CommercialAdvert”中的一个,指示应实例化哪个类,但所有子类的所有列都将位于同一个表中。好处是不需要连接,但缺点是子类上的所有附加列都必须可以为null或具有默认值。其他可能的策略包括:每类型表(TPT)、组合策略或每具体类型表(TPC),其中每个子类型都有自己的唯一表,其中包含所有超类型的所有字段。

您描述所需内容的方式尚不清楚。也许给我们举一个例子,说明你想用你的代码做什么,并解释你对代码的哪一部分感到困惑?对不起我的英语,我添加了一个例子x Chris,“你最终会得到一个带有鉴别器列的广告表”我在Identity 2.x中看到了这一点,我会尝试。。。但需要更多地了解;)