添加ViewModel类会将codefirst模型添加到数据库中

Jas*_*mes 5 c# asp.net-mvc entity-framework entity-framework-6 asp.net-mvc-5

我需要在我的ASP.NET MVC 5项目中使用视图模型,但是当我在模型文件夹中添加一个时,一个新实体被添加到数据库中,我被迫添加了一个迁移并更新了我的数据库.我不希望这种情况发生,因为它是我正在添加的视图模型,而不是我需要持久化回数据库的模型.我想构建一些控制器和视图,所以我在类中添加了一个主键.我没有将新创建的视图模型添加到我的DbContext班级.

视图模型:

    public class RolesViewModel 
    { 
        public int RolesViewModelId { get; set; }
        public string Role { get; set; } 
    }
Run Code Online (Sandbox Code Playgroud)

有没有办法创建一个不会自动添加到DbContext类中的视图模型,从而导致数据模型发生变化?

非常感谢,

杰森.

Chr*_*att 7

无论你称之为视图模型,实体等,它只是语义.一切都只是一个类,它所使用的上下文决定了你所指的是什么.对于实体,这是在您的显式或隐式添加引用DbContext,这是您最终添加到数据库中的内容的唯一方法.我强调"或隐含*部分是因为如果任何一类在你的引用DbContext,或连接到引用有任何类中的任何类,也引用了你的'视图模型’,它会在你的数据库中结束.实体框架会自动跟随您的类层次结构并为所有关系创建表,即使您没有直接在您的层中引用这些层次结构中的特定类DbContext.

  • 听起来好像你以某种方式搭建了这个类,因为如果你只是添加一个类,Visual Studio通常不会为你添加它的`DbContext`,给它一个`Id`属性等等.所以,如果那是在这种情况下,我建议不要使用脚手架,只是从头开始创建一个新类.现在,当您基于视图模型构建控制器和视图时,脚手架假设您正在为它提供一个实体,因此它将创建所有视图,例如它是否正在处理实体.同样,最好的解决方案是在这些场景中不使用脚手架. (2认同)

Adr*_*ley 1

在您的情况下,脚手架将在您的 appContext 类中添加以下代码

public DbSet<RolesViewModel> RolesViewModel { get; set; }

如果您愿意,您仍然可以使用脚手架,但是请记住删除该条目,并且代码不会首先创建任何表。它将使您的数据库保持干净。