部分类实现接口null对象

时间:2014-07-14 04:05:56

标签: c# .net entity-framework interface abstract-class

下面是ISubject界面。部分student_subject和Tutor_subject都是自动生成的,但这些部分类用于允许父gemeroc抽象类。

在我将student_Subject“sub”传递给新的SubjectDTO(ISubject主题)之前,它具有所有属性。例如,sub.name等于“math”。

enter image description here

但是,一旦我将它传递给构造函数,SubjectDTO(ISubject subject)的所有属性都是null。

enter image description here

抱歉,如果我看起来很新,但有人知道为什么对象不会保留其属性。 这是代码

 public abstract class  ISubject
{
    public int SubjectId { get; set; }
    public string Name { get; set; }
    public System.Data.Entity.Spatial.DbGeography Location { get; set; }
    public virtual ICollection<ICourse> Courses { get; set; }

}
public partial class Student_Subject :ISubject
{

    public DbSet<Student_Subject> getContext(studytree_dbEntities db)
    { return db.Student_Subject; }

}
public partial class Tutor_Subject :ISubject
{
    public DbSet<Tutor_Subject> getContext(studytree_dbEntities db)
    { return db.Tutor_Subject; }

}

这是自动生成的类

 public partial class Student_Subject
  {
    public Student_Subject()
    {
        this.Courses = new HashSet<Student_Course>();
    }

    public int SubjectId { get; set; }
    public string Name { get; set; }
    public int Student_CourseId { get; set; }
    public System.Data.Entity.Spatial.DbGeography Location { get; set; }

    public virtual ICollection<Student_Course> Courses { get; set; }
    public virtual Student Student { get; set; }
}
}

这是我的StudentDTO。

    public class StudentDTO
     {
       public StudentDTO()
     {
         this.StudySessions = new HashSet<StudySessionDTO>();
        this.Subjects= new HashSet<SubjectDTO>();
    }
         public StudentDTO(Student s)
    {
        this.StudentId = s.StudentId;
        this.FirstName = s.FirstName;
        this.LastName = s.LastName;

        this.StudySessions = new HashSet<StudySessionDTO>();
        this.Subjects = new HashSet<SubjectDTO>();
             foreach(Student_Subject sub in s.Subjects)
             {
                 this.Subjects.Add(new SubjectDTO(sub));
             }
    }
  }

主题DTO  但是,当执行到此类时,该对象具有所有null属性。

 public class SubjectDTO
 {
       public SubjectDTO()
    {
        this.Courses = new HashSet<CourseDTO>();
    }
    public SubjectDTO(ISubject subject)
       {
           this.SubjectId = subject.SubjectId;
           this.SubjectName = subject.Name;
           this.Location = subject.Location;
           this.Courses = new HashSet<CourseDTO>();
            foreach(ICourse course in subject.Courses)
            {
                this.Courses.Add(new CourseDTO(course));
            }
       }

这是例外

  

发生了'System.NullReferenceException'类型的异常   StudyTree.dll但未在用户代码中处理

     

附加信息:对象引用未设置为的实例   对象

     

InnerException对象引用未设置为对象的实例。

     

StackTrace:在StudyTree.Models.SubjectDTO..ctor(ISubject主题)   在c:\ Users \ Ethan \ Documents \ Visual Studio中   2013 \ Projects \ StudyTree \ StudyTree \ Models \ SubjectDTO.cs:第21行at   StudyTree.Models.StudentDTO..ctor(学生)   c:\ Users \ Ethan \ Documents \ Visual Studio   2013 \ Projects \ StudyTree \ StudyTree \ Models \ UserDTO.cs:第118行   StudyTree.Models.PersonDTO..ctor(人物)in   c:\ Users \ Ethan \ Documents \ Visual Studio   2013 \ Projects \ StudyTree \ StudyTree \ Models \ UserDTO.cs:第31行   StudyTree.Repository.LoginRepository.getPersonDTO(Person p)in   c:\ Users \ Ethan \ Documents \ Visual Studio   2013 \项目\ StudyTree \ StudyTree \库\ LoginRepository.cs:行   41在MvcApplication2.Controllers.ProfileController.Login(JObject   j)在c:\ Users \ Ethan \ Documents \ Visual Studio中   2013 \项目\ StudyTree \ StudyTree \ \控制器ProfileController.cs:行   34在lambda_method(Closure,Object,Object [])at   System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor&LT;&GT; c__DisplayClass10.b__9(对象   instance,Object [] methodParameters)at   System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(对象   instance,Object [] arguments)at   System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext   controllerContext,IDictionary`2参数,CancellationToken   的CancellationToken)

1 个答案:

答案 0 :(得分:1)

您声明自己在[{1}}和ISubject课程中实施名为Student_Subject的界面。尽管如此,情况并非如此,您从名为Tutor_Subject的抽象类中真正继承。前缀ISubject必须 ONLY 用于接口,而不是抽象类。

问题来自你认为抽象类会像接口一样反应的事实。

实施界面时,您需要履行合同,重写您班级中的所有代码。

继承一个类(来自抽象的一个事件)时,你不必重写超类中定义的代码。

您实际上重新定义了子类中的属性I,它隐藏了超类的属性。 Visual Studio会显示有关该内容的警告。

  

Name需要关键字new,因为其隐藏属性Name

要纠正这一点,只需将ISubject.Name替换为public abstract class ISubject即可创建一个真正的界面,并在界面正文中进行必要的更改。