Kristofer Källsbo
Kristofer Källsbo

Reputation: 1087

Use Entity Framework to store user specific data

I have read a few articles about .Net Entity Framework that really didn't make me want to try it out. But now I have started a small test.

I set up a MVC 3 site that will handle economy transactions for my family, just for fun. So I setup Membership provider and get the login functions working. Usually I use the Membership Guid in a column to identify each row to a specific user.

I setup this class in my project:

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; }
    }
}

Works fine but I get the information on all users. If user A logs on and creates a few transaction then user B can create an account and see them. What is best practice here? How do I keep the user data separated?

I even tried setting the UserID as a private like this:

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

But that didn't work at all.

Upvotes: 1

Views: 1208

Answers (2)

Ricardo Souza
Ricardo Souza

Reputation: 16456

In your controller, use a linq query or the fluent api to retrieve only the desired entries:

TransactionDBContext db = new TransactionDBContext();
Guid userID = (Guid)Membership.GetUser().ProviderUserKey;

Query builder:

var transactions = db.Transactions.Where(t => t.UserId == userID);

Or Linq:

var transactions = from transaction in db.Transactions
                   where transaction.UserId == userID
                   select transaction;

Edit:

Do you want to always get the data filtered by userId without having to do where clauses in every place?

Your best bet in this case is to create a method in the model to retrieve this data for you:

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

Upvotes: 2

Boolean Operation
Boolean Operation

Reputation: 91

In your "Transactions" list page, just limit the transactions by the 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);
 }
}

Upvotes: 1

Related Questions