使用 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
被存储
但是Track
的ICollection<PlaybackEvent>
在我做var tracks = myDbContext.Tracks.ToList();
时没有填充
即使我用myDbContext.Tracks.Add(track); myDbContext.SaveChanges();
保存了track
在ICollection<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 与 many 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