2017-07-13 1 views
0

J'utilise la technique codefirst dans mon application MVC ASP.NET pour générer ma base de données. J'ai tenté de créer une relation un à plusieurs entre deux de mes tables, Client et Chambre.Entity Framework crée des enregistrements indésirables dans la base de données dans une ou plusieurs relations

Je souhaite qu'un client puisse réserver une ou plusieurs pièces.

Ce qui suit est mon modèle client:

public class Customer 
{ 
    public int id { get; set; } 

    [Display(Name = "Name")] 
    public string name { get; set; } 

    [Display(Name = "Email Address")] 
    public string email { get; set; } 

    [Display(Name = "Phone Number")] 
    public string phoneno { get; set; } 

    [Display(Name = "Date of Birth")] 
    public DateTime DOB { get; set; } 

    [Display(Name = "CNIC")] 
    public string cnic { get; set; } 

    public List<int> Roomsid { get; set; } 


    [Display(Name = "Check In Date")] 
    public DateTime? checkin { get; set; } 

    [Display(Name = "Check Out Date")] 
    public DateTime? checkout { get; set; } 

    public List<Room> Room { get; set; } 
} 

Et ce qui suit est le modèle

public class Room 
{ 
    public int id { get; set; } 

    public int floorno { get; set; } 

    public string roomclass { get; set; } 

    public int cost { get; set; } 

    public string bedcount { get; set; } 

    public string facilities { get; set; } 

    public string description { get; set; } 

    public int? Customerid { get; set; } 

} 

Disons que chaque fois que je passe un objet client à ma base de données, les cadres de l'entité crée de nouveaux records Chambre même lorsque je définis le RoomID pour les entrées client correspondantes.

Permettez-moi de préciser, disons que je lance le code suivant:

ApplicationDbContext x = new ApplicationDbContext(); 
     var a = new Customer() { }; 
     var b = new List<Room>() { 
      new Room { id=2 ,floorno=2, bedcount="2", cost=2, description="2", facilities="2", roomclass="2" }, 
      new Room {id=3 ,floorno=3, bedcount="3", cost=2, description="3", facilities="3", roomclass="3" }, 
      new Room {id=4 ,floorno=4, bedcount="4", cost=4, description="4", facilities="4", roomclass="4" }, 
     }; 


     a.checkin = Convert.ToDateTime("05 Mar 2017"); 
     a.checkout = Convert.ToDateTime("07 Mar 2017"); 
     a.DOB = Convert.ToDateTime("02 Mar 2000"); 
     a.cnic = "asfsgwlkgnwe98hf0"; 
     a.email = "agjw98e98weg98"; 
     a.name = "Äfnan Makhdoom"; 
     a.Rooms = b; 

     x.Customers.Add(a); 
     x.SaveChanges(); 

Ou même quand je ne définit aucun autre paramètre, sauf l'ID de chambre dans ma variable b, je reçois des documents supplémentaires créés dans mon Table de pièces dans ma base de données.

Même si je choisis RoomID comme 1, il créera un nouvel enregistrement avec un nouvel ID de chambre avec d'autres champs identiques à ceux que je définis. De l'aide?

+0

J'ai toujours voulu le savoir moi-même! –

+0

La propriété 'Rooms' de l'objet' Customer' doit être 'virtual'. Voir la réponse similaire ici https://stackoverflow.com/questions/42411810/updating-child-objects-in-entity-framework-6/42412120#42412120 – Venky

+0

La mise à virtuelle n'a fait aucune différence –

Répondre

0

Si tout ce que vous essayez de faire est d'ajouter un client à une pièce existante, vous pourriez faire quelque chose comme ceci.

var a = new Customer() { }; 
    var roomWithId3 = x.Rooms.Single(x => x.Id == 3); 

    a.rooms.Add(roomWithId3); 
    x.Customers.Add(a); 
    x.SaveChanges(); 
+0

var b = nouvelle Liste () { vontex.Rooms.Single (n => n.id == 2), vontex.Rooms.Single (n => n.id == 3), vontex.Chambres .Single (n => n.id == 4) }; a.Chambres = bex; bien que je devais le faire mais ça a marché! Merci beaucoup –