实体框架 5 - 代码第一个数组导航属性与接口类型一对多

Luc*_*lla 4 foreign-key-relationship code-first navigation-properties ef-code-first entity-framework-5

这些是我的课程:

public class Post : IPost
{
    public int Id { get; set; }
    public virtual int[] DuplicateOf { get; set; }
    public virtual ICommentInfo[] Comments { get; set; }
}

 public class CommentInfo : ICommentInfo
{
    public virtual string Author { get; set; }
    public virtual int Id { get; set; }
    public virtual string Text { get; set; }

    public virtual int PostId{ get; set; }
    [ForeignKey("PostId")]
    public virtual Post Post { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

将此 CommentConfiguration 添加到 OnModelCreate() 中:

HasRequired(c => c.Post)
            .WithMany(b=>(ICollection<CommentInfo>) b.Comments)
            .HasForeignKey(b=>b.PostId)
            .WillCascadeOnDelete(true);
Run Code Online (Sandbox Code Playgroud)

我真的无法理解为什么属性 Comments 总是空的,为什么 EF 不初始化它,因为它是虚拟的。我也尝试禁用延迟加载,但是当我尝试加载带有context.Post.Include("Comments")错误的导航属性时,告诉我“没有名为 Comments 的导航属性”。所以我尝试使用Entity Framework Power Tools Beta 3来查看实体数据模型,我发现即使两个表之间存在关系并且还有Comment表端,表“Post”也没有导航端。

真心不知道该往哪个方向转,会不会是Array的问题??我应该使用 Icollection 属性吗?虽然我无法更改该属性的类型,因为 Post 正在实现一个接口。

我查看的每个样本都清晰且易于制作。请帮助我.. 提前谢谢你。

编辑:

这是我在查看我昨天发布的链接后更改的内容。

  public class Post : IPost
  {
    public int Id { get; set; }
    public virtual int[] DuplicateOf { get; set; }
    public virtual ICollection<CommentInfo> Comments { get; set; } 
    ICommentInfo[] IPost.Comments { 
      get { return Comments ; } 
      set { Comments = (CommentInfo[])value; } }
  }
Run Code Online (Sandbox Code Playgroud)

例外是:System.ObjectDisposedException :The ObjectContext instance has been disposed and can no longer be used for operations that require a connection当应用程序尝试获取评论时引发。如果我删除virtual键,异常就会消失,但该属性始终为空,并且值不会以任何方式持续存在。

EDITv2 我已经解决了添加新属性并将旧属性映射到它的问题。

public class Post : IPost
{
    public int Id { get; set; }
    public virtual int[] DuplicateOf { get; set; }
    public ICommentInfo[] Comments
    {
        get { return ListComments.ToArray(); }

    }
    public List<CommentInfo> ListComments {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

在我的 PostConfiguration OnModelCreate() 中,我使用 ListComments 属性作为导航属性,如下所示:

HasMany(b => b.ListComments)
                .WithRequired(c=>c.Post)
                .HasForeignKey(c=>c.PostId)
                .WillCascadeOnDelete(true);
Run Code Online (Sandbox Code Playgroud)

现在它完美运行,它比我预期的更简单,当我尝试接收评论集合时,如果我包含“ListComments”属性,我会得到 Post 数组。感谢您的帮助!

Ger*_*old 6

我无法访问您评论中的链接,但我认为您已更改

public virtual ICommentInfo[] Comments { get; set; }
Run Code Online (Sandbox Code Playgroud)

进入定义导航属性的常用方法:

public virtual ICollection<CommentInfo> Comments { get; set; }
Run Code Online (Sandbox Code Playgroud)

因为实体框架在其概念模型中不支持接口。

已处理上下文的异常意味着您在Post从数据库获取对象处理上下文后访问此属性。这会在与数据库的连接丢失时触发延迟加载。解决方案是使用Include

var posts = context.Posts.Include(p => p.Comments).Where(...)
Run Code Online (Sandbox Code Playgroud)

现在帖子和评论是一次性获取的。