0

Im having trouble linking my loaned items to my Library for each customer. It does it fine when it goes through the "AddToLibrary" method but when it comes to retreiving it, the medialibrary is empty and the query in the IEnumerable<Item> ItemsOnLoan method is returning null. This is a very basic ASP.NET MVC 4 application and im very new to this so its probably something silly ive missed out.

I just want to be able to add an item to the loaned items table, have the list of loaned items for each customer appear in their personal Library (defined in model) and then retreive the list of their items. Below is all the code and I am using a code first approach. Thank you :)

Model

public class Customer
{
        public int Id { get; set; }
        public string ForeName { get; set; }
        public string SurName { get; set; }
        public Address address { get; set; }
        public string Email { get; set; }
        public string Telephone { get; set; }
        public string Mobile { get; set; }
        public List<LoanedItem> Library { get; set; }

        public Customer()
        {

            if (Library == null || Library.Count == 0)
            {
                Library = new List<LoanedItem>();
            }
        }

        public IEnumerable<Item> ItemsOnLoan
        {
            get
            {
                var items = (from i in Library
                             where i.Customer.Id == this.Id
                             select i).OfType<item>();
                return items;
            }
        }
}

Loaned Item model

public class LoanedItem
{
    public int? Id { get; set; }
    public Customer Customer { get; set; }
    public MediaItem Item { get; set; }
}

ItemController --> adding to library method

public ActionResult AddToLibrary(int id)
{

    Item libraryItem = db.Items.Find(id);
    Customer c = db.Customers.Find(1);
    LoanedItem newLoanGame = new LoanedItem()
    {
        Customer = c,
        Item = libraryItem
    };
    db.LoanedItems.Add(newLoanGame);
    db.SaveChanges();
    return RedirectToAction("Index");
}

Customer Controller

public ActionResult ViewProfile(int id = 1)
{
    Customer c = db.Customers.Find(id);
    if (c == null)
    {
        return HttpNotFound();
    }
    return View(c);
}
public ActionResult GetLibraryItems(int id = 1)
{
    var items = db.Customers.Find(id).ItemsOnLoan;
    return View(items);
}

Context

public class LibraryContext : DbContext
{
    public DbSet<Address> Addresses { get; set; }
    public DbSet<Customer> Customers { get; set; }
    public DbSet<LoanedItem> LoanedItems { get; set; }
    public DbSet<Item> Items { get; set; }

    public LibraryContext()
        : base("LbContext")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new CustomerConfiguration());
        modelBuilder.Configurations.Add(new LoanedItemConfiguration());
        modelBuilder.Entity<Item>();
        modelBuilder.Entity<Address>();

        base.OnModelCreating(modelBuilder);
    }
    }
user1290653
  • 775
  • 3
  • 11
  • 23

1 Answers1

0

Assuming that Proxy generation is enabled try this:

public class Customer
{
    public int Id { get; set; }
    public string ForeName { get; set; }
    public string SurName { get; set; }
    public Address address { get; set; }
    public string Email { get; set; }
    public string Telephone { get; set; }
    public string Mobile { get; set; }
    public virtual ICollection<LoanedItem> ItemsOnLoan { get; set; }

    public Customer()
    {
    }
}

using this to acccess:

public ActionResult GetLibraryItems(int id = 1)
{
    var customer = db.Customers.Find(id);
    if (customer != null)
    {
        var items = customer.ItemsOnLoan;
        return View(items);
    }
    //handle not found or throw an exception
    throw new Exception();
}

follow this link for more information on Proxies and Lazy Loading.

qujck
  • 14,388
  • 4
  • 45
  • 74