2017-06-20 1 views
0

Je travaille sur une application de cinéma qui permet aux utilisateurs de surfer à travers des films, des lieux de cinéma et leur permet d'acheter ou de réserver des billets. Si un utilisateur a réservé un ticket en ligne, le ticket doit être activé dans les 12 heures par le vendeur qui utilise également le même programme. J'ai besoin de montrer les informations du ticket sur la grille et je dois le rendre modifiable. Voici mes classes de base de données qui doivent être incluses dans la requête et avoir une relation avec la classe Sale. (Je veux choisir des objets de la classe de vente qui comprend des cours est lié ti:. Ticket, client, film, état et infos saloonComment faire un EF modifiable Sélectionner une requête pour le contrôle de la grille DevExpress?

Vente Classe:

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; } 
} 

Ticket Classe:

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; } 
} 

classe client:

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; } 
} 

classe utilisateur:

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

    public string Name { get; set; } 

    public string Surname { get; set; } 
} 

Classe d'état (contient des informations sur les tickets. Acheté ou réservé)

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; } 
} 

Berline Classe:.

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

    public string Name { get; set; } 

    public double salePrices { get; set; } 
} 

Classe Film:

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

    public string Name { get; set; } 
} 

Je ne peux pas modifier parce que dans ma requête de sélection J'utilise type anonyme pour la sélection . Mon code de requête:

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; 

Mais dans la grille, les données n'ont pas pu être modifiées. Ensuite, j'ai essayé de joindre chaque table en utilisant les requêtes Linq to Entities mais cela n'a pas aidé non plus. Est-il possible de faire une source de données à partir de mes objets liés qui permet l'option d'édition dans la grille? Merci.

Répondre

0

Les types anonymes (ceux que vous pouvez déclarer via l'opérateur nouvel dans la méthode Select) ne peuvent pas avoir de propriétés accessibles en écriture dans .NET. C'est pourquoi la grille n'est pas modifiable. Pour tirer parti de l'édition sur place, vous devez instancier des objets d'un type CLR réel. Pour cela, vous pouvez déclarer une classe ViewModel spéciale avec des propriétés publiques que vous devez remplir avec les valeurs de la méthode Select à l'aide de object initializer.

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

Notez que vous ne devriez pas déplacer la logique d'initialisation de la propriété au constructeur ViewModel à l'utiliser de cette façon:

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

Le initialiseur d'objet est l'arbre d'expression, ce qui Entity Framework peut se traduire par un SQL question. Le constructeur est juste une référence de méthode, Entity Framework rejettera une telle expression. Si vous souhaitez utiliser cette approche, vous devrez appeler la méthode ToList avant la sélection. SaleViewModel peut avoir la méthode acceptant la classe DbContext pour enregistrer les modifications.

Vous pouvez également sélectionner les instances de vente et utiliser des chemins de propriété complexes dans les noms de champs des colonnes (tels que "Customer.User.Name"). Cela peut probablement vous aider à simplifier la logique d'enregistrement, car vous n'aurez pas besoin de trouver un modèle spécifique à un modèle de vue particulier et de copier des valeurs de propriété modifiées.