我已经阅读了一些关于.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;
但这根本不起作用。
答案 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);
}
}