1

.Net Entity Framework に関するいくつかの記事を読んだことがありますが、実際に試してみたいとは思いませんでした。しかし今、私は小さなテストを始めました。

私は楽しみのために、家族のために経済取引を処理する MVC 3 サイトをセットアップしました。そこで、メンバーシップ プロバイダーをセットアップし、ログイン機能を動作させます。通常、列のメンバーシップ 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 クエリまたは流暢な 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;

編集:

すべての場所で where 句を実行することなく、userId によってフィルター処理されたデータを常に取得したいですか?

この場合の最善の策は、モデルにメソッドを作成して、このデータを取得することです。

// 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 に答える