微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

实体框架:创建一个与另一个具有多种关系的类

如何解决实体框架:创建一个与另一个具有多种关系的类

考虑以下类:

public class Kid
        {
            
            public int Id { get; set; }
            public string FirstName { get; set; } 
            public string LastName { get; set; }
            public Date Time BirthDate { get; set; }
            public ProfilePhoto CurrentProfilePhoto { get; set; }
            public virtual ICollection<ProfilePhoto> ProfilePhotos { get; set; }
    }
 public class ProfilePhoto
        {
            public int Id { get; set; }
            public byte[] PhotoData { get; set; }
            public DateTime DateTaken { get; set; }
            public DateTime DateUploaded { get; set; }
    
            public int KidID { get; set; }
            public Kid Kid { get; set; }
    }

每个孩子实体都有多张个人资料照片,但它可能有或没有一张当前的个人资料照片。 另一方面,每个 ProfilePhoto 都与一个孩子相关,并且该 Kid 的一个 ProfilePhoto 可以是当前的个人资料照片。 如何在 EntityFramework 6.4 中使用 DataAnnotations 或 FluentAPI(如果可能,我更喜欢使用 DataAnnotations)来表示这些类型的关系。

解决方法

您可以使用三种方法:

选项 1:将 CurrentProfilePhotoId 属性添加到 Kid 作为 CurrentProfilePhoto 导航属性的 FK。

[ForeignKey("CurrentProfilePhoto")]
public int? CurrentProfilePhotoId { get; set; }
public virtual ProphilePhoto CurrentProfilePhoto { get; set; }

选项 2:将 CurrentProfilePhoto 标记为 [NotMapped] 并在客户端从 ProfilePhotos 集合中计算它:

[NotMapped]
public ProphilePhoto CurrentProfilePhoto
{
    get { return ProfilePhotos.OrderByDescending(x => x.DateTaken).FirstOrDefault(); }
}

选项 3:从实体中移除 CurrentProfilePhoto,并在需要当前照片时依靠投影到 ViewModel。即

var kid = context.Kids
    .Where(x => x.Id == kidId)
    .Select(x => new KidDetailViewModel
    {
        Id = x.Id,Name = x.LastName + "," + x.FirstName,BirthDate = x.BirthDate,CurrentProfilePhoto = x.ProfilePhotos
            .OrderByDescending(p => p.DateTaken)
            .FirstOrDefault()
    }).Single();

选项 1 非常简单,但是无法明确强制 CurrentProfilePhotoId 引用的任何照片都是该 Kid 的照片。它可能会意外地与与该 Kid ID 无关的任何其他记录的照片相关联。使用此类引用时,建议您在数据库中设置数据完整性检查作业,以在 CurrentPhotoId 引用的照片具有不同的 Kid ID 时提醒您。

选项 2 确保当前照片始终与该孩子相关联,但是您需要记住在加载 Kid 时始终急切加载整个 ProfilePhotos 集合,否则会触发该集合的延迟加载以获取该集合当前照片。

选项 3 是我推荐的习惯投影的方法。这可确保仅引用该孩子的照片,并生成一个查询,该查询仅提取足够的数据来填充您在特定时间所需的内容。在此示例中,只会从 Kid 记录中拉回一张照片以及必要的详细信息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。