实体框架代码第一关系和导航属性?

时间:2011-10-01 08:52:34

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

我有以下课程

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; }
    }

我使用以下代码配置它,我希望Subject可以有很多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来获取它们,为什么我需要双向属性?

1 个答案:

答案 0 :(得分:1)

  

1)我做得对吗?

  

2)我是否需要在Subject类中使用导航属性?

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

  

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

这是另一种关系。它代表了一对一的关系。但是因为你想要一对多的关系,你的实体必须有一个导航集合

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来获取它们,为什么我需要它   双向属性?

你不需要它。