1

我已经阅读了几篇关于 .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;

但这根本不起作用。

4

2 回答 2

2

在您的控制器中,使用 linq 查询或 fluent 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);
}
于 2012-07-07T23:02:16.417 回答
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);
 }
}
于 2012-07-07T23:01:06.770 回答