1

要了解我正在开发的 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 需求的最佳模式(最正确/最优雅)是哪一种?

4

0 回答 0