“'学生'是一个名称空间,但用于类型”错误,同时在DbContext中声明DbSet

问题描述:

我试图使用与名称空间具有相同名称的类来声明StudentDbContextDbSet属性。“'学生'是一个名称空间,但用于类型”错误,同时在DbContext中声明DbSet

这是我StudentDbContext代码

using Student.Web.Models;  
using Microsoft.EntityFrameworkCore; 

namespace Student.Web.StudentContext 
{ 
    public class StudentDbContext : DbContext 
    { 
     public StudentDbContext() 
     { 

     } 

     public DbSet<Student> Students { get; set; } 

    } 
} 

的代码,在那里我想声明DbSet<Student>抛出错误消息的最后一行:

“学生”是一个命名空间,但为使用像一个类型

这是我的模型命名空间

namespace Student.Web.Models 
{ 
    public class Student 
    { 
     public int StudentId { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
    } 
} 

我无法理解为什么会发生这种情况。我有一个名为Student的模型类。

.Net Core是否处理命名空间不同?

+0

不,但您可能没有声明学生课程所在的名称空间。你应该发布你的学生模型,包括命名空间 – Tseng

+0

@tseng我dint让你感到抱歉。但是我添加了名称空间的模型文件,并显示了我如何将它包含在我的dbcontext中。我无法弄清楚什么是错的。我不知道我在那里失去了什么。 – nakulchawla09

听起来就像你有一个命名空间和一个名为Student的类。不太好。为了解决这个问题,你可以在类名的前面加上名称空间;像Student.Student一样。但最好的想法是重命名命名空间,我会说!

https://blogs.msdn.microsoft.com/ericlippert/2010/03/09/do-not-name-a-class-the-same-as-its-namespace-part-one/

当你有命名空间&模型之间的冲突,将using声明命名空间声明

using Microsoft.EntityFrameworkCore; 

namespace Student.Web.StudentContext 
{ 
    // Move it here 
    using Student.Web.Models; 

    public class StudentDbContext : DbContext 
    { 
     public StudentDbContext() 
     { 

     } 

     public DbSet<Student> Students { get; set; } 

    } 
} 

namespace Student.Web.Models 
{ 
    public class Student 
    { 
     public int StudentId { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
    } 
} 

内。当编译器查找类,会先使用内部usings,当它没有找到它,将搜索外部使用中的类型。

这在C#中一直都是这样工作的,而.NET Core并不是什么新东西。

这样做的原因是,当你有Student.Web.StudentContext的命名空间,你可以访问所有类型的Student.Web.StudentContextStudent.WebStudent没有using声明。

但是在你有的情况下,编译器不知道你是否想引用Student(命名空间)或Student.Web.Models.Student这个类。

通过移动使用声明中可以固定的,因为编译器会发现里面Student命名空间Student.Web.Models而不是进一步的查找(与Student命名空间结束)。