我真的希望 Microsoft 能够对其默认的 MVC 项目模板进行一些改进,以更好地阐明正确的 MVC 开发,但这似乎没有发生。
一般来说,每个类需要一个文件。这没有技术原因,但它使代码的使用变得更加容易。例如,您的Meeting
类将在Meeting.cs
文件,然后您就不必想知道它在哪里。您知道要查找同名文件。
Then, AccountModels.cs
实际上主要包含查看模型(仅查看 MVC5 中的模型,实际上,我确实注意到 Microsoft 通过命名文件在 MVC5 中改进了这一点AccountViewModels.cs
)。 “模型”一词在 ASP.NET MVC 中的使用相当宽松。您的实体框架支持的类(或 POCO)实际上是所谓的“实体”(因此称为“实体框架”),实体基本上只是一个 DTO 或数据传输对象,并不真正适合用作model。视图模型是用于表示视图的某些功能的类。就表单而言,通常最终会成为正在创建或更新的实体的传真,但在大多数情况下,它们的影响范围可能更远,并且具有比适当添加到实体更多的业务逻辑。
在 MVC5 之前的默认项目模板中,您唯一的“实体”是UserProfile
。我住在同一个地方AccountModels.cs
文件以及应用程序的默认上下文,UsersContext
。将此文件中的每个类拆分为它们自己的文件会更合适:UserProfile.cs
, UsersContext.cs
, etc.
在 MVC5 中,您唯一的实体是ApplicationUser
,这再次处于不利地位IdentityModels.cs
,该文件还包含为您的应用程序默认生成的上下文。如果把它们分成几部分就更好了ApplicationUser.cs
and ApplicationDbContext.cs
files.
无论如何,典型的布局是同时具有Models
目录和一个ViewModels
目录。实体进入Models
目录(主要不符合惯例,因为同样,它们并不是真正合适的“模型”)并且显然视图模型位于ViewModels
目录。如果这是一个简单的项目,我通常会将上下文移到根目录中,或者如果我将拥有多个上下文(连接到多个数据库),则仅为上下文创建一个单独的目录。
再次强调,这都是可选的。事实上,您可以做任何您想做的事情,但是遵循其中一些事情可以使您的项目的工作和维护变得更加简单,也使其他开发人员更容易从您离开的地方继续。
UPDATE
这并没有真正回答你的问题之一,这似乎是关于你应该如何关联Meeting
与你的“用户”类(UserProfile
/ApplicationUser
取决于您的 MVC 工作版本)。
第一步始终是确定两件事之间关系的本质。是一对一的吗?一对多?多对多?我不能代表你的申请,但是Meeting
seems就像它应该是多对多一样:一个用户可以召开许多会议,而一个会议可以包括许多用户。在这种情况下,您只需在两侧设置一个集合:
用户配置文件/应用程序用户
public virtual ICollection<Meeting> Meetings { get; set; }
Meeting
public virtual ICollection<UserProfile> Attendees { get; set; }
Or
public virtual ICollection<ApplicationUser> Attendees { get; set; }
这足以向实体框架传达这是一个多对多关系,并且它将在幕后自动创建一个中间表来跟踪该关系。