要了解我正在开发的 ASP.NET MVC 4 模式和必须管理一些数据和用户内容的应用程序。
这是数据库:
public DbSet<UserProfile> UserProfiles { get; set; }
public DbSet<Fund> Funds { get; set; }
public DbSet<Source> Sources { get; set; }
public DbSet<Portfolio> Portfolios { get; set; }
public DbSet<Quote> Quotes { get; set; }
public DbSet<Deposit> Deposits { get; set; }
其中关系基数是:
- UserProfile(用户) - 投资组合:1-N
- 用户资料 - 存款:1-N
- 投资组合 - 基金:NM
- 基金 - 来源:1-N
- 基金 - 报价:1-N
- 资金-存款:1-N
数据库中还有 ASP.NET 简单成员表:webpages_Membership、webpages_OAuthMembership、webpages_Roles、webpages_UsersInRoles。
用户资料模型:
[Table("UserProfile")]
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
}
投资组合模型:
public class Portfolio
{
public int Id { get; set; }
[Display(Name = "Label")]
[MaxLength(30)]
[Required(ErrorMessage = "Insert a label.")]
public string Label { get; set; }
[DataType(DataType.Date)]
[Display(Name = "Created on")]
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
public DateTime CreationDate { get; set; }
public virtual int UserId { get; set; } // Foreign key for UserProfile table
public virtual ICollection<Fund> Funds { get; set; } // Linked Funds
}
也就是说,这就是应用程序应该让用户做的事情:
- 注册/登录;
- 仅查看/修改/创建自己的投资组合/存款;
- 管理基金和投资组合;
- 现在这几乎是全部......
我在这里发布了我对投资组合控制器的索引操作的实际实现。我需要用户名来获取作为投资组合表上的外键的 UserId,以仅获取特定用户的投资组合。然后我使用 LINQ 进行查询。
[Authorize]
public class PortfolioController : Controller
{
private readonly MyDb _db = new MyDb();
public ActionResult Index()
{
string userName = null;
if (HttpContext.User.Identity.IsAuthenticated)
{
userName = HttpContext.User.Identity.Name;
}
var result = _db.UserProfiles
.Where(u => u.UserName.Equals(userName))
.Join(_db.Portfolios, u => u.UserId, p => p.UserId, (u, p) => p);
return View(result);
}
}
那么,这种方法呢?我已经知道这可能不是最好的解决方案......
然后,在Create 操作中, 我需要 UserId 将新的投资组合与正确的用户相关联,那么我该怎么办?
//
// GET: /Portfolio/Create
public ActionResult Create()
{
return View();
}
//
// POST: /Portfolio/Create
[HttpPost]
public ActionResult Create(Portfolio portfolio)
{
if (ModelState.IsValid)
{
// TODO:
// Here I need the UserId to associate the new portfolio with the user!
// I don't want to make another LINQ query to get the UserId from Username.
// ...
_db.Portfolios.Add(portfolio);
_db.SaveChanges();
return RedirectToAction("Index");
}
return View(portfolio);
}
当然,我需要用存款模型做同样的事情,因为用户创建了一个新的存款,并且只能查看/编辑他自己的存款。
我想知道的是:
在许多控制器操作和视图上,管理用户内容和 Username/UserId 需求的最佳模式(最正确/最优雅)是哪一种?