首先在EF代码中使用动态导航属性或BaseEntity

时间:2019-02-14 14:21:23

标签: c# asp.net-core ef-code-first entity-framework-core

这个问题可能很简单,但是逻辑很重要,对此我感到困惑。在带有实体框架核心代码的Asp.Net Core 2.1中,我想学习如何建模,因此我简化了这个问题。两个不同实体(中心和文章)中的一个相同导航属性(照片)。中心可以有很多照片,文章可以有一张照片。一张照片可以有一个帖子或一个中心,所以可以有一个MyEntityBase。示例:

public class Photo
{
    public int Id { get; set; }
    public string Url { get; set; }

    //The question/relation problem is here???
    //public int CenterId { get; set; }
    //public virtual Center Center { get; set; }

    //public int ArticleId { get; set; }
    //public virtual Article Article{ get; set; }

    //public int MyEntityBaseId { get; set; }
    //public virtual MyEntityBase ArticleOrPost{ get; set; }
}

public class Article: MyEntityBase
{
    [Key]
    public int Id { get; set; }

    public string Title { get; set; } 

    //Common Photo property
    //One article has one photo
    public virtual Photo ArticlePhoto { get; set; }

}
public class Center: MyEntityBase
{
    [Key]
    public int Id { get; set; }

    public string Name{ get; set; } 

    //Common Photo property
    //One center has many photo
    public virtual List<Photo> CenterPhotos { get; set; }

}  

1 个答案:

答案 0 :(得分:0)

乍看之下,如果您使用的是Entity Framework Core ...请不要使用virtual

所以您的Article对象应该看起来像这样

public class Article: MyEntityBase
{
    [Key]
    public int Id { get; set; }

    public string Title { get; set; } 

    public int ArticlePhotoId { get; set; }

    //Common Photo property
    //One article has one photo
    public Photo ArticlePhoto { get; set; }

}

您的照片对象看上去正确,{@ {1}}下面的行删除了CenterId

在Center对象中,使用virtual代替ICollection

其余的应该只是自动映射而无需配置文件。

编辑: 关于List,如果您使用的是延迟加载,则似乎可以支持它,但是需要进行配置才能进行设置。我会先使事情尽可能简单,然后验证它是否有效,然后再添加延迟加载。

参考:navigation property should be virtual - not required in ef core?