Я пытаюсь узнать asp.net MVC, конвертируя приложение веб-форм, которое у меня есть. Это приложение для бронирования номеров, где есть стол для клиентов (tblCustomerBooking), который имеет отношения друг к другу с tblRental - так что один клиент может забронировать более одной комнаты. Поля, которые соответствуют друг другу, это tblCustomerBooking.customer_id -> tblRental.customer_refСвязывание двух таблиц в EntityFramework CodeFirst модели
Я пытаюсь сначала использовать код и создать класс модели, но я не могу понять, как связать две таблицы, чтобы когда я запрашиваю dbContext, он вернет клиента с одной или несколькими арендами в одной модели.
Мои определения таблицы являются:
CREATE TABLE [dbo].[tblCustomerBooking](
[customer_id] [bigint] IDENTITY(1,1) NOT NULL,
[room_id] [bigint] NULL,
[customer_name] [varchar](110) NULL,
[customer_email] [varchar](50) NULL
CONSTRAINT [PK_tblCustomerBooking] PRIMARY KEY CLUSTERED
(
[customer_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
CREATE TABLE [dbo].[tblRental](
[rental_id] [bigint] IDENTITY(1,1) NOT NULL,
[room_id] [bigint] NOT NULL,
[check_in] [datetime] NOT NULL,
[check_out] [datetime] NOT NULL,
[customer_ref] [bigint] NULL,
[room_cost] [decimal](18, 2) NULL
CONSTRAINT [PK_tblRental_1] PRIMARY KEY CLUSTERED
([rental_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Моя попытка построения модели для этого:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Data.Entity;
namespace MvcApplication23.Models
{
public class tblRental
{
[Key()]
public int rental_id { get; set; }
public int room_id { get; set; }
public DateTime check_in { get; set; }
public DateTime check_out { get; set; }
public long customer_ref { get; set; }
[ForeignKey("customer_ref")]
public tblCustomerBooking Customer {get;set;}
public decimal room_cost { get; set; }
}
public class tblCustomerBooking
{
[Key()]
public long customer_id { get; set; }
public string customer_name { get; set; }
public string customer_email { get; set; }
public ICollection<tblRental> Rentals {get;set;}
}
public class RentalContext : DbContext
{
public DbSet<tblCustomerBooking> customers { get; set; }
public DbSet<tblRental> rentals { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
}
Контроллер:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Web.Http;
using MvcApplication23.Models;
namespace MvcApplication23.api.Controllers
{
public class RentalController : ApiController
{
private RentalContext db = new RentalContext();
// GET /api/rental/5
public IQueryable<tblCustomerBooking> Get(int id)
{
return db.customers.Include("rentals").FirstOrDefault(c=>c.customer_id==id);
}
** Я обновил информация выше, с фактическими именами таблиц, которые уже существовали в t он база данных **
Как связать две таблицы в модели? А затем, учитывая customer_id, как я могу запросить DbContext для возврата клиента с любыми связанными данными в таблице tblRental?
Большое спасибо за любые указатели,
Марк
Привет - спасибо. Это не сработало бы, пока я не вытащил ссылки «Vurtual» в классе. Теперь, когда я пытаюсь выполнить запрос, он заявляет: не может неявно преобразовать тип «MvcApplication23.Models.Customer» в «System.Linq.IQueryable». Явное преобразование существует (вам не хватает роли?) ... Кто-нибудь сможет прояснить, что случилось, пожалуйста? Спасибо. –
Mark
@MarkTait: Вы помещаете FirstOrDefault в конце вашего запроса? – Gregoire
Благодарим вас за ответ - да, я сделал - мой контроллер: public IQueryable Get (int id) { возвращение db.customers.Include ("аренда"). FirstOrDefault (c => c.customer_id == id); } –
Mark