使用 Code First 自动检索复杂类型的 ICollection

Posted

技术标签:

【中文标题】使用 Code First 自动检索复杂类型的 ICollection【英文标题】:Auto-retrieve ICollection of complex type with Code First 【发布时间】:2012-07-10 22:57:34 【问题描述】:

[将 Code First DbContext 与 Entity Framework 5.0 RC 一起使用]

不确定发生了什么?

个人Tracks 被存储 和个人PlaybackEvents被存储 但是TrackICollection<PlaybackEvent> 在我做var tracks = myDbContext.Tracks.ToList(); 时没有填充 即使我用myDbContext.Tracks.Add(track); myDbContext.SaveChanges(); 保存了trackICollection<PlaybackEvents> 中有几个PlaybackEvents

希望与赛道相关的部分

public class Track 

    public string Id get; set;

    private ICollection<PlaybackEvent> _playbackEvents;

    public ICollection<PlaybackEvent> PlaybackEvents
    
        get  return _playbackEvents ?? (_playbackEvents = new List<PlaybackEvent>()); 
        set  _playbackEvents = value; 
    

简化的播放事件

public class PlaybackEvent 
    public string Id get; set;

    public string Track_Id  get; set; 

【问题讨论】:

你看到数据库中的数据了吗? 【参考方案1】:

您的导航属性ICollection 需要声明为virtual

对您的代码的另一个建议是不要为导航属性显式声明 getter 和 setter,而是将 setter 职责移至构造函数。让你的代码看起来像这样:

public class Track  
 
    public Track()
    
        this.PlaybackEvents = new HashSet<PlaybackEvent>();
    

    // Primary key
    public string Id get; set; 

    // Navigation property
    public virtual ICollection<PlaybackEvent> PlaybackEvents  get; private set;  
 

您的 PlaybackEvent 实体还需要一个导航属性来启用 one Track 与 ma​​ny PlaybackEvents 的关系:

public class PlaybackEvent 
  
    // Primary key
    public string Id get; set;  

    // Foreign key
    public string Track_Id  get; set;   

    // Navigation property
    public virtual Track Track  get; set; 
  

【讨论】:

解决方案!我将确保 1)在构造函数中初始化 ICollection 2)在两者中声明导航属性 3)将导航属性声明为虚拟。 p.s.查看 PlaybackEvents 表,我看到两个字段,一个称为 Track_Id,另一个称为 Track_Id1,但两者具有相同的值,不知道为什么会有这样的重复..

以上是关于使用 Code First 自动检索复杂类型的 ICollection的主要内容,如果未能解决你的问题,请参考以下文章

EF Code-First 学习之旅 Code First Conventions

Code First约定-Fluent API配置

EF Code First学习笔记

使用 EF Code First 继承 – 每个类型的表 (TPT)

EF5 Code First - 使用迁移更改列类型

20.1翻译系列:EF 6中自动数据迁移技术EF 6 Code-First系列