【问题标题】:Entity Framework code first relationships and navigation property?实体框架代码优先关系和导航属性?
【发布时间】:2011-10-01 19:29:37
【问题描述】:

我有以下课程

public class Subject{
        public int SubjectId { get; set; }
        public String SubjectName { get; set; }
        public String SubjectCategory { get; set; }
    }

public class QuestionDescriptor {
        public int QuestionDescriptorId { get; set; }        
        public String QuestionText { get; set; }
        public String Answer { get; set; } 
        public int SubjectId { get; set; }
        public virtual Subject Subject { get; set; }
    }

我已经使用以下代码对其进行了配置,我希望一个主题可以有多个 QuestionDescriptors

 modelBuilder.Entity<QuestionDescriptor>()
                .HasRequired(qd => qd.Subject)
                .WithMany()
                .HasForeignKey(qd => qd.SubjectId)
                .WillCascadeOnDelete(true);

现在我有以下问题

  1. 我做得对吗?
  2. 我需要 Subject 类中的导航属性吗?
  3. 如果我这样做会发生什么

    public class Subject {
            public int SubjectId { get; set; }
            public String SubjectName { get; set; }
            public String SubjectCategory { get; set; }
            public int QuestionDescriptorId {get;set;}
            public virtual QuestionDescriptor {get;set;} 
        }
    
  4. 如果我执行上述操作,我需要对配置进行哪些更改?为什么?

  5. 如果我想要属于特定主题的所有问题,那么我可以通过查询 QuestionDescriptor 来获得它们,为什么我需要双向属性?

【问题讨论】:

    标签: c#-4.0 entity-framework-4.1 ef-code-first


    【解决方案1】:

    1) 我做对了吗?

    是的。

    2) 我需要 Subject 类中的导航属性吗?

    没有。你不需要它。它可能对某些查询有所帮助,但不是必需的。

    3) 如果我这样做会发生什么...

    那是另一种关系。它将代表一对一的关系。但是因为你想要一个一对多的关系,你必须在你的实体上有一个导航 collection

    public class Subject {
        public int SubjectId { get; set; }
        public String SubjectName { get; set; }
        public String SubjectCategory { get; set; }
        public virtual ICollection<QuestionDescriptor> Descriptors {get;set;} 
    }
    

    4) 如果我执行上述操作,我需要在配置中进行哪些更改和 为什么?

    对于上述更改,您可以保持映射配置不变 - 唯一的例外是您现在必须将集合指定为关系的另一端。而不是 .WithMany() 你使用

    .WithMany(s => s.Descriptors)
    

    5) 如果我想要属于某个特定主题的所有问题,那么 我可以通过查询 QuestionDescriptor 来获取它们,那我为什么需要 双向属性?

    你不需要它。

    【讨论】:

    • 在第 3 个问题中,如果我只有一个导航属性,那不会改变我在数据库中的表结构吗?
    • @ashutoshrina:在您的问题中public virtual QuestionDescriptor 的示例中,是的,它会改变表结构,因为它是一对一的关系。在我的 public virtual ICollection&lt;QuestionDescriptor&gt; Descriptors 示例中,它不会更改数据库,因为关系仍然相同(一对多)。
    • 是的,你是对的。我试过了,数据库结构没有变化,这让我的查询变得简单。非常感谢你的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 2012-10-11
    • 2017-07-05
    • 1970-01-01
    相关资源
    最近更新 更多