使用Entity Framework存储用户特定数据

时间:2012-07-07 22:40:43

标签: asp.net-mvc entity-framework

我已经阅读了一些关于.Net Entity Framework的文章,这些文章真的没让我想尝试一下。但现在我开始了一个小测试。

我建立了一个MVC 3网站,为我的家人处理经济交易,只是为了好玩。所以我设置了会员提供程序并使登录功能正常工作。通常我会在列中使用Membership Guid来标识特定用户的每一行。

我在我的项目中设置了这个类:

namespace mEconomy.Models
{
    public class Transaction
    {
        public Guid UserID { get; set; }
        public int TransactionID { get; set; }
        public DateTime Date { get; set; }
        public string Text { get; set; }
        public string Category { get; set; }
        public decimal Amount { get; set; }
    }


    public class TransactionDBContext : DbContext
    {

        public DbSet<Transaction> Transactions { get; set; }
    }
}

工作正常但我获得了所有用户的信息。如果用户A登录并创建了一些事务,则用户B可以创建一个帐户并查看它们。这里的最佳做法是什么?如何保持用户数据分离?

我甚至尝试将UserID设置为私有,如下所示:

private Guid UserID = (Guid)Membership.GetUser().ProviderUserKey;

但这根本不起作用。

2 个答案:

答案 0 :(得分:2)

在您的控制器中,使用linq查询或流畅的api仅检索所需的条目:

TransactionDBContext db = new TransactionDBContext();
Guid userID = (Guid)Membership.GetUser().ProviderUserKey;

查询构建器:

var transactions = db.Transactions.Where(t => t.UserId == userID);

或Linq:

var transactions = from transaction in db.Transactions
                   where transaction.UserId == userID
                   select transaction;

修改

您是否希望始终通过userId过滤数据,而无需在每个地方执行where子句?

在这种情况下,最好的办法是在模型中创建一个方法来为您检索这些数据:

// In your model code
public IQueryable<Transaction> FromCurrentUser()
{
    Guid userID = (Guid)Membership.GetUser().ProviderUserKey;
    return db.Transactions.Where(t => t.UserId == userID);
}

答案 1 :(得分:1)

在“交易”列表页面中,只需按UserId限制交易。

public ActionResult List() {
 using (var db = new TransactionDBContext()) {
  var results = db.Transactions.Where(x => x.UserID == (Guid)Membership.GetUser().ProviderUserKey).ToList();
  return View(results);
 }
}