如何在ASP .NET MVC中将对象列表与用户(Account)关联

我想为我的应用程序的每个用户存储一个对象列表。

我想为每个用户添加一个Meeting对象List 。 当然,我想用Entity Framework进行这项工作

 public class Meeting{ int Id {get;set;} Person Person {get;set;}//Meeting with person DateTime DateTime{get;set;} } 

问题:我应该将其添加到AccountModels.cs吗? 我应该在哪里添加它? 它应该是公正的会议吗? 或许我需要他们之间的联想课?

我发布下面的AccountModels.cs文件的内容。

 using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Data.Entity; using System.Globalization; using System.Web.Security; namespace OdeToFood.Models { public class RegisterExternalLoginModel { [Required] [Display(Name = "User name")] public string UserName { get; set; } public string ExternalLoginData { get; set; } } public class LocalPasswordModel { [Required] [DataType(DataType.Password)] [Display(Name = "Current password")] public string OldPassword { get; set; } [Required] [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "New password")] public string NewPassword { get; set; } [DataType(DataType.Password)] [Display(Name = "Confirm new password")] [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")] public string ConfirmPassword { get; set; } } public class LoginModel { [Required] [Display(Name = "User name")] public string UserName { get; set; } [Required] [DataType(DataType.Password)] [Display(Name = "Password")] public string Password { get; set; } [Display(Name = "Remember me?")] public bool RememberMe { get; set; } } public class RegisterModel { [Required] [Display(Name = "User name")] public string UserName { get; set; } [Required] [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "Password")] public string Password { get; set; } [DataType(DataType.Password)] [Display(Name = "Confirm password")] [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] public string ConfirmPassword { get; set; } } public class ExternalLogin { public string Provider { get; set; } public string ProviderDisplayName { get; set; } public string ProviderUserId { get; set; } } } 

我真的希望微软能够对他们的默认MVC项目模板进行一些改进,以更好地阐明正确的MVC开发,但这似乎并没有发生。

通常,每个类需要一个文件。 这没有技术上的原因,但它使您的代码更容易使用。 例如,您的Meeting类将进入Meeting.cs文件,然后您不必怀疑它在哪里。 您知道要查找同名文件。

然后, AccountModels.cs实际上主要包含视图模型 (仅在MVC5中查看模型,实际上,我确实注意到Microsoft通过命名文件AccountViewModels.cs在MVC5中对其进行了AccountViewModels.cs )。 在ASP.NET MVC中,“模型”这个术语非常松散。 您的entity framework支持的类或​​POCO实际上是所谓的“实体”(因此是“entity framework”),实体基本上只是一个DTO或数据传输对象,并不适合用作模型 。 视图模型是用于表示视图的某些function的类。 在表单的情况下,通常最终会成为您的实体被创建或更新的传真,但它们可以更远,并且具有比在大多数情况下添加到实体更合适的业务逻辑。

默认项目模板(MVC5之前)中唯一的“实体”是UserProfile 。 我驻留在相同的AccountModels.cs文件中,以及应用程序的默认上下文UsersContext 。 将这个文件中的每个类拆分成自己的文件会更合适: UserProfile.csUsersContext.cs等。

在MVC5中,您唯一的实体是ApplicationUser ,它再次放在IdentityModels.cs ,这个文件还包含应用程序的默认生成上下文。 如果将它们拆分为ApplicationUser.csApplicationDbContext.cs文件会好得多。

无论如何,典型的布局是同时拥有Models目录和ViewModels目录。 实体进入Models目录(大多数不符合惯例,因为它们不是真正合适的“模型”),显然视图模型位于ViewModels目录中。 我通常要么将我的上下文移动到root中,如果它是一个简单的项目,或者只是为了上下文创建一个单独的目录,如果我将不仅仅有一个(连接到多个数据库)。

同样,这都是可选的。 事实上,你可以做任何你想做的事情,但是遵循其中的一些事情可以使你的项目工作和维护变得更加简单,并且让其他开发人员更容易接受你离开的地方。

UPDATE

这并没有真正回答你的一个问题,这似乎是关于你应该如何将Meeting与你的“用户”类( UserProfile / ApplicationUser取决于你的MVC的工作版本)联系起来。

第一步始终是确定两件事之间关系的本质。 它是一对一的吗? 一到多少? 许多一对多? 我不能代表您的申请,但Meeting 似乎应该是多对多的:用户可以举行多次会议,会议可以包括许多用户。 在这种情况下,您只需在两侧设置一个集合:

用户配置/ ApplicationUser

 public virtual ICollection Meetings { get; set; } 

会议

 public virtual ICollection Attendees { get; set; } 

要么

 public virtual ICollection Attendees { get; set; } 

这足以与Entity Framework进行通信,这是一个多对多的关系,它将在幕后自动创建一个中间表来跟踪它。