Как я могу реализовать контроллер ASP.NT MVC? - PullRequest
0 голосов
/ 23 мая 2019

Я новичок в .NET FRAMEWORK и пытаюсь придумать ASP.NET MVC API для недвижимости. В моей базе данных есть таблица Product and Amenity. Я предполагаю, что продукт, например, квартира может иметь несколько удобств, например [{'Gym'}, {'Wifi'}]. Поэтому я создал еще одну таблицу ProductAmenity, которая ссылается на Product и Amenity.

До сих пор я придумал класс продукта, класс удобства и класс продукта с соответствующим Контроллером продуктов и Контроллером продуктов. В настоящее время, когда я делаю запрос get на свой ProductsController, он возвращает все остальные значения, кроме того, что возвращает значение NULL в Object-ProductAmenity, несмотря на то, что они являются данными в таблице ProductAmenity.

Here are my controllers:

namespace api_realEstate.Controllers
{
public class ProductsController : ApiController
    {
        readonly RealEstateDBEntities entities;
        public ProductsController()
        {
            entities = new RealEstateDBEntities();
        }
        private List<ProductView> PrepProducts(List<Product> dbProducts)
        {
            var productsView = new List<ProductView>();
            foreach (var product in dbProducts)
            {
                productsView.Add(
                    new ProductView
                    {
                        Id = product.ID,
                        Category = product.Category,
                        Address = product.Location,
                        Amount = product.Price,
                        Beds = product.Bathroom,
                        Baths = product.Bedroom,
                        Area = product.Area,
                        Parking = product.Parking,
                        ParkingSpot = product.ParkingSpot,
                        Description = product.Description,
                        Term = product.Term,
                        UserId = product.UserID
                    });
            }
            return productsView;
        }
        public IHttpActionResult Get()
        {
            var dbProducts = entities.Products.ToList();
            return Ok(PrepProducts(dbProducts));
        }
	}	
}	

namespace api_realEstate.Controllers
{
    public class AmenitiesController : ApiController
    {
        readonly RealEstateDBEntities entities;
        public AmenitiesController()
        {
            entities = new RealEstateDBEntities();
        }
        private List<AmenityView> PrepAmenities(List<Amenity> dbAmenities)
        {
            var amenitiesView = new List<AmenityView>();
            foreach (var amenity in dbAmenities)
            {
                amenitiesView.Add(
                    new AmenityView
                    {
                        Id = amenity.ID,
                        Itemname = amenity.ItemName                       
                    });
            }
            return amenitiesView;
        }
        public IHttpActionResult Get()
        {
            var dbAmenities = entities.Amenities.ToList();
            return Ok(PrepAmenities(dbAmenities));
        }
	}
}	

namespace api_realEstate.Controllers
{
    public class ProductAmenitiesController : ApiController
    {
        readonly RealEstateDBEntities entities;
        public ProductAmenitiesController()
        {
            entities = new RealEstateDBEntities();
        }
        private List<ProductAmenityView> PrepProductAmenities(List<ProductAmenity> dbProdAmenity)
        {
            var prodamenityView = new List<ProductAmenityView>();
            foreach (var prodamenity in dbProdAmenity)
            {
                prodamenityView.Add(
                    new ProductAmenityView
                    {
                        Id = prodamenity.ID,
                        Productid = prodamenity.ProductID,
                        Amenityid = prodamenity.AmenityID                        
                    });
            }
            return prodamenityView;
        }
        public IHttpActionResult Get()
        {
            var dbProdAmenity = entities.ProductAmenities.ToList();
            return Ok(PrepProductAmenities(dbProdAmenity));
        }
	}
}
Here are my classes:

public partial class Product
    {
        public Product()
        {
            this.ProductAmenities = new HashSet<ProductAmenity>();
            this.ProductImages = new HashSet<ProductImage>();
        }    
        public long ID { get; set; }
        public string Category { get; set; }
        public string Location { get; set; }
        public int Price { get; set; }
        public int Bedroom { get; set; }
        public int Bathroom { get; set; }
        public Nullable<int> Area { get; set; }
        public string Parking { get; set; }
        public Nullable<int> ParkingSpot { get; set; }
        public string Description { get; set; }
        public string Term { get; set; }
        public long UserID { get; set; }    
        public virtual User User { get; set; }
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<ProductAmenity> ProductAmenities { get; set; }
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<ProductImage> ProductImages { get; set; }
    }	
    
public partial class Amenity
    {      
        public Amenity()
        {
            this.ProductAmenities = new HashSet<ProductAmenity>();
        }    
        public long ID { get; set; }
        public string ItemName { get; set; }    
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<ProductAmenity> ProductAmenities { get; set; }
    }
    
public partial class ProductAmenity
    {
        public long ID { get; set; }
        public long ProductID { get; set; }
        public long AmenityID { get; set; }    
        public virtual Amenity Amenity { get; set; }
        public virtual Product Product { get; set; }
    }	

Я ожидаю, что при выполнении запроса (GET) к моему ProductsController у меня должны быть значения, возвращенные в моем объекте ProductAmenity. Как я могу применить отношения между этими таблицами: Product, Amenity и ProductAmenity в моем контроллере?

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

In the productsView Model I just added this and it worked:

private List<ProductView> PrepProducts(List<Product> dbProducts)
        {
            var productsView = new List<ProductView>();
            foreach (var product in dbProducts)
            {
                productsView.Add(
                    new ProductView
                    {
                        Id = product.ID,
                        UserId = product.UserID,
                        Category = product.Category,
                        Address = product.Location,
                        Amount = product.Price,
                        Beds = product.Bathroom,
                        Baths = product.Bedroom,
                        Area = product.Area,
                        Parking = product.Parking,
                        ParkingSpot = product.ParkingSpot,
                        Description = product.Description,
                        Term = product.Term,

                        Amenities = product.ProductAmenities.Select(x => new Models.ProductAmenity
                        {
                            Id = x.ID,
                            Amenity = new AmenityView
                            {
                                Id = x.Amenity.ID,
                                Itemname = x.Amenity.ItemName
                            }
                        }).ToList()
                      
            });
            return productsView;
        }
0 голосов
/ 23 мая 2019

Я думаю, вам нужно включить, как это:

 public IHttpActionResult Get()
 {
      var dbProducts = entities.Products.Include(x => x.ProductAmenities).ToList();
      return Ok(PrepProducts(dbProducts));
 }

А затем в PrepProducts Action вместо foreach используйте этот:

  var productsView = dbProducts.Select(product => new ProductView {
                            Id = product.ID,
                            Category = product.Category,
                            Address = product.Location,
                            Amount = product.Price,
                            Beds = product.Bathroom,
                            Baths = product.Bedroom,
                            Area = product.Area,
                            Parking = product.Parking,
                            ParkingSpot = product.ParkingSpot,
                            Description = product.Description,
                            Term = product.Term,
                            UserId = product.UserID,
                            ProductAmenities = product.ProductAmenities.Select(//use viewmodel to cast it, like to ProductView )

                }).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...