2017-06-20 44 views
0

我正在製作一個電影應用程序,它允許用戶通過電影,電影院地點衝浪並允許他們購買或預訂門票。如果用戶在線預訂了機票,則該機票必須在12小時內由也使用相同程序的賣方激活。我需要在網格上顯示票證信息,並且需要進行編輯。這是我的數據庫類,必須包含在查詢中並與Sale類有關係。 (我想選擇出售類,其中包括TI的相關的類對象:票,客戶,電影,地位和轎車的相關信息如何爲DevExpress網格控件製作可編輯的EF Select查詢?

Sale類:

public class Sale 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

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

    [ForeignKey("StatusId")] 
    public virtual Status Status { get; set; } 
    public int StatusId { get; set; } 

    public virtual Seller Seller { get; set; } 

    public DateTime SellDate { get; set; } 

    public double Price { get; set; } 

    [ForeignKey("TicketID")] 
    public virtual Ticket Ticket { get; set; } 
    public int TicketID { get; set; } 
} 

客票艙位等級:

public class Ticket 
{ 
    public Ticket() 
    { 
     Seats = new List<Seat>(); 
    } 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    [ForeignKey("MovieId")] 
    public virtual Movie Movie { get; set; } 
    public int MovieId { get; set; } 

    public virtual List<Seat> Seats { get; set; } 

    public virtual TimeSpan SeanceTime { get; set; } 

    public bool IsActive { get; set; } 

    public DateTime BuyDate { get; set; } 

    [ForeignKey("SaloonId")] 
    public virtual Saloon Saloon { get; set; } 
    public int? SaloonId { get; set; } 

    public string TicketNumber { get; set; } 
} 

客戶類別:

public class Customer 
{ 
    public Customer() 
    { 
     Sales = new List<Sale>(); 
     CreditCards = new List<CreditCard>(); 
    } 
    [Key] 
    public int UserID { get; set; } 

    public virtual List<Sale> Sales { get; set; } 

    public virtual User User { get; set; } 

    [DataType(DataType.CreditCard)] 
    public virtual List<CreditCard> CreditCards { get; set; } 
} 

用戶等級:

public class User 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    public string Name { get; set; } 

    public string Surname { get; set; } 
} 

狀態類(持有門票的信息。購買或保留)

public class Status 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    public bool IsRez { get; set; } 

    public bool IsBuy { get; set; } 

    public bool IsCancel { get; set; } 

    public bool IsPaid { get; set; } 
} 

轎車類:

public class Saloon 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    public string Name { get; set; } 

    public double salePrices { get; set; } 
} 

電影類:

public class Movie 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    public string Name { get; set; } 
} 

我不能因爲我的選擇查詢編輯我使用匿名類型供選擇。我的查詢代碼:

var Source = entities.Sales.Where(w => w.Ticket.Saloon.CinemaPlace.ID == seller.CinemaPlace.ID).Select(s => new 
     { 
      CustomerName = s.Customer.User.Name, 
      CustomerSurname = s.Customer.User.Surname, 
      SalePrice = s.Price, 
      s.Status.IsBuy, 
      s.Status.IsCancel, 
      s.Status.IsPaid, 
      s.Status.IsRez, 
      MovieName = s.Ticket.BuyDate, 
      s.Ticket.Movie.Name, 
      SaloonName = s.Ticket.Saloon.Name, 
      s.Ticket.SeanceTime, 
      s.Ticket.TicketNumber 
     }).ToList(); 

     RezervationsGrid.DataSource = Source3; 

但是在網格中,數據無法編輯。然後我嘗試使用Linq to Entities查詢加入每個表,但它也沒有幫助。有沒有辦法讓我的相關對象的數據源,允許在網格中的編輯選項?謝謝。

回答

0

匿名類型(您可以在Select方法中通過運算符聲明的那些類型)不能在.NET中具有可寫屬性。這就是網格不可編輯的原因。要利用就地編輯,您需要實例化一個真正的CLR類型的對象。

爲此,您可以聲明一個具有公共屬性的特殊ViewModel類,您應該使用object initializer在Select方法中填充值。

.Select(s => new SaleViewModel() { 
    CustomerName = s.Customer.User.Name, 
    SalePrice = Price 
}) 

請注意,您應該屬性初始化邏輯不會移動到視圖模型構造函數使用這種方式:

.Select(s => new SaleViewModel(s)) 

對象初始化器是表達式樹,實體框架可以轉化爲一個SQL查詢。構造函數只是一個方法引用,所以Entity Framework會拒絕這樣的表達式。如果你想使用這種方法,你需要在Select之前調用ToList方法。

SaleViewModel可以接受DbContext類來保存更改。

您還可以選擇Sale實例並在列的字段名稱(例如「Customer.User.Name」)中使用複雜的屬性路徑。這可能可以幫助您簡化保存邏輯,因爲您不需要查找特定於某個視圖模型的模型並複製修改後的屬性值。

相關問題