2012-07-07 60 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