2012-07-07 54 views
1

我已阅读有关.NET实体框架一些文章,真的没有让我想尝试一下用户的特定数据。但是现在我已经开始了一个小测试。使用实体框架来存储

我成立了一个MVC 3网站将处理经济事务为我的家人,只是为了好玩。所以我设置了会员供应商并获得了登录功能。通常,我使用列中的“成员指导”来为特定用户标识每行。

我建立这个类在我的项目:

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可以创建一个帐户并查看它们。这里最好的做法是什么?我如何保持用户数据分离?

我甚至尝试设置用户ID为私有这样的:

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

但是,这并没有在所有的工作。

+1

只是不退货的交易,其中用户ID不会将当前用户匹配。 – Dai 2012-07-07 22:44:35

回答

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; 

编辑:

你要总是由用户id过滤数据,而不必做where子句中的每一个地方?

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

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

谢谢你的回答! 我知道我能做到这样。但我追求的是投入的模型类此直接,所以我不必每次都这样做的一种方式。 – 2012-07-08 00:36:45

+0

我明白你想要什么。看到我更新的答案。 – rcdmk 2012-07-08 00:46:26

+0

非常好的输入!谢谢! 为了使它与Linq一起工作,你必须打破它: Guid currentUser =(Guid)Membership.GetUser()。ProviderUserKey;返回查看(db.Transactions.Where(t => t.UserID == currentUser).ToList()); – 2012-07-09 16:10:30

1

在您的“交易”列表页,仅仅通过用户ID限制交易。

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

谢谢你的回答! 我知道我能做到这样。但我追求的是投入的模型类此直接,所以我不必每次都这样做的一种方式。 – 2012-07-08 00:37:50