2

我正在尝试通过转换我拥有的 Web 表单应用程序来学习 asp.net MVC。这是一个房间预订应用程序,其中有一个与 tblRental 具有一对多关系的客户表 (tblCustomerBooking) - 因此一个客户可以预订多个房间。相互匹配的字段是 tblCustomerBooking.customer_id -> tblRental.customer_ref

我正在尝试首先使用代码 - 并构建一个模型类 - 但我无法弄清楚如何链接这两个表,因此当我查询 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);
        }

** 我已经用数据库中已经存在的实际表名更新了上面的信息 **

如何链接模型中的两个表?然后给定一个 customer_id,我将如何查询 DbContext 以返回一个客户,以及 tblRental 表中的任何相关条目?

非常感谢您的任何指点,

标记

4

2 回答 2

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);
于 2012-06-04T09:29:23.100 回答
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;}
}
于 2014-08-11T08:23:41.893 回答