MVC.NET - 具有两个相同类型的虚拟属性的模型

时间:2014-08-02 21:59:24

标签: c# asp.net-mvc

我有一个MVC.NET应用程序,其中包含许多模型,其中一些包含具有以下属性的类:

public class Species
{
    [Key]
    public int SpeciesID { get; set; }
    public string SpeciesName { get; set; }
    public virtual List<Photo> Photos { get; set; }
}

public class Photo
{
    [Key]
    public Guid PhotoID { get; set; }
    public int? SpeciesID { get; set; }
    [ForeignKey("SpeciesID")]
    public virtual Species Species { get; set; }
}

用户可以上传照片并使用物种进行标记。 一个物种可以有多张照片。 一张照片只能有一种。 访问Species类的Photos属性会自动加载所有物种的照片。 我现在要做的是将以下内容添加到Species类中:

    public Guid? DefaultPhotoID { get; set; }
    [ForeignKey("DefaultPhotoID")]
    public virtual Photo DefaultPhoto { get; set; }

这允许用户为物种选择默认照片。 这也有效,并且DefaultPhoto属性会根据DefaultPhotoID属性自动填充。 但是,一旦我添加上面的代码,Species类的Photos属性就会停止返回任何内容。 我认为这与Species类现在有两个Photo类型的虚拟属性(一张照片和一组照片)有关,并且由于某种原因不知道如何处理该集合。 有谁知道它为什么破坏以及如何解决它? 更具体一点 - 我还有其他模型,它们形成一个层次结构(order-&gt; family-&gt; genus-&gt; species),它们也可以正常工作,直到添加DefaultPhoto属性。

修改 为了更好地解释这个问题,我已经上传了项目的简化版本,其中只包含类的层次结构: http://www.speedyshare.com/dgCJw/MvcTest-VirtualProperty.zip

它目前有一个包含4个照片项目的数据库,如果您进入任何模型(订单,家庭,物种等)的索引视图,您将看到正确显示的照片总数。

但是,如果将DefaultPhotoID和DefaultPhoto属性添加到BaseModel(只是取消注释现有代码),这些数字将不再显示(它们将为0)。

我希望能够解释这个问题 - 我想使用Photos属性而无需运行自定义查询来填充它。

1 个答案:

答案 0 :(得分:0)

您是否确认删除List<Photo>属性会使DefaultPhoto生效?如果没有,你可能会咆哮错误的树。

您可以考虑修改您的人际关系。而不是将DefaultPhotoId放在Species表上。也许您可以在Photo表中添加bool Default。然后,您可以通过查找标记为物种的第一张照片并将其标记为默认照片来获取默认照片。