2012-06-04 8 views
2

Я пытаюсь узнать 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?

Большое спасибо за любые указатели,

Марк

ответ

5

Чтобы связать два объекта, обеспечивают свойство навигации:

public class Rental 
{ 
    [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 int customer_ref { get; set; } 

    [ForeignKey("customer_ref")] 
    public virtual Customer Customer {get;set;} 

    public decimal room_cost { get; set; } 
} 

public class Customer 
{ 
    [Key] 
    public int customer_id { get; set; } 
    public string customer_name { get; set; } 
    public string customer_email { get; set; } 

    public virtual ICollection<Rental> Rentals {get;set;} 
} 

И опрашивать клиента:

return this.DataContext.customers.Include("Rentals").FirstOrDefaul(c=>c.customer_id==customerId); 
+0

Привет - спасибо. Это не сработало бы, пока я не вытащил ссылки «Vurtual» в классе. Теперь, когда я пытаюсь выполнить запрос, он заявляет: не может неявно преобразовать тип «MvcApplication23.Models.Customer» в «System.Linq.IQueryable ». Явное преобразование существует (вам не хватает роли?) ... Кто-нибудь сможет прояснить, что случилось, пожалуйста? Спасибо. – Mark

+0

@MarkTait: Вы помещаете FirstOrDefault в конце вашего запроса? – Gregoire

+0

Благодарим вас за ответ - да, я сделал - мой контроллер: public IQueryable Get (int id) { возвращение db.customers.Include ("аренда"). FirstOrDefault (c => c.customer_id == id); } – Mark

0
using System.ComponentModel.DataAnnotations.Schema; 


public class Rental 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public virtual int id { get; set; } 
    public virtual int room_id { get; set; } 
    public virtual DateTime check_in { get; set; } 
    public virtual DateTime check_out { get; set; } 
    public virtual int customer_id { get; set; } 
    public virtual decimal room_cost { get; set; } 

    #region Navigation Properties 
    [ForeignKey("customer_id")] 
    public virtual Customer Customer { get; set; } 
    #endregion 
} 

public class Customer 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int id { get; set; } 
    public string name { get; set; } 
    public string email { get; set; } 

    public virtual ICollection<Rental> Rentals {get;set;} 
} 
Смежные вопросы