1

J'essaye de construire une architecture à trois niveaux avec BLL, DAL et UI. Je travaille sur un petit projet de système de gestion d'appartement (qui comprend les informations sur les étudiants résidents, leurs chambres et l'appartement des chambres qu'ils occupent). Depuis que je suis un débutant j'ai quelques problèmes techniques que je dois résoudre. J'utilise Entity Framework avec un modèle de référentiel. Mon projet est basé sur l'approche MVVM et j'utilise Automapper.Entity Framework avec Repository Pattern, insertion de données dans des tables avec une relation many-to-many

Codes pour Automapper

public class AutoMapperProfile : Profile 
{ 
    public AutoMapperProfile() 
    { 
     CreateMap<Room, RoomViewModel>().ReverseMap(); 
     CreateMap<Apartment, ApartmentViewModel>().ReverseMap(); 
    } 
} 

public class AutoMapperConfig 
{ 
    public static void Configure() 
    { 
     Mapper.Initialize(x => 
     { 
      x.AddProfile<AutoMapperProfile>(); 
     }); 
    } 
} 

Je suis en train d'ajouter une nouvelle pièce à ma base de données. Il y a un grand nombre à plusieurs entre ma chambre et tables Appartement et ma base de données ressemble à ceci:

My Database's screen shot

mon interface IRepository ressemble à:

public interface IRepository<T> where T : class 
{ 
    IEnumerable<T> GetAll(); 
    T GetById(int id); 
    T Get(Expression<Func<T, bool>> expression); 
    IQueryable<T> GetMany(Expression<Func<T, bool>> expression); 
    bool Insert(T obj); 
    bool Update(T obj); 
    bool Delete(int id); 
    int Count(); 
    void Save(); 
} 

Je RoomRepository et ApartmentRepository, les deux implémentent l'interface IRepository. J'ai créé mes dépôts et infrastructures:

Infrastructure (dossier)

  • IApartmentRepository.cs
  • IRepository.cs
  • IRoomRepository.cs
  • IStudentRepository.cs
  • IUserRepository.cs

Reposi tory (dossier)

  • ApartmentRepository.cs
  • RoomRepository.cs
  • StudentRepository.cs
  • UserRepository.cs

Tout en ajoutant une nouvelle salle, admin doit indiquer à quel appartement cette pièce appartient. La méthode Ajouter dans la RoomController est ci-dessous:

[HttpPost] 
    public JsonResult Add(RoomViewModel roomModel) 
    { 
     try 
     { 
      //var apartViewModel = new ApartmentRoomViewModel(); 
      //apartViewModel.ApartmentID = roomModel.ApartmentNameId; 
      var room = AutoMapper.Mapper.Map<Room>(roomModel); 
      var status = _roomRepository.Insert(room); 
      _roomRepository.Save(); 
      //apartViewModel.RoomID = room.Id; 

      return Json(new { status, message = "Ekleme işlemi başarılı." }, JsonRequestBehavior.AllowGet); 
     } 
     catch (Exception) 
     { 
      return Json(new { status = false, message = "Hata! Ekleme işlemi gerçekleştirilemedi." }, JsonRequestBehavior.AllowGet); 
     } 
    } 

RoomViewModel

public class RoomViewModel 
{ 

    public int Id { get; set; } 

    public int DoorNumber { get; set; } 

    public int FloorNumber { get; set; } 

    public int Capacity { get; set; } 

    public int Fullness { get; set; } 

    public string ApartmentName { get; set; } 

    public int ApartmentNameId { get; set; } 
} 

UI

Room Add UI

Ma question est, quand je veux insérer la données I ta Depuis l'utilisateur dans la page d'ajout de salle, je peux ajouter les informations collectées pour la pièce à la table de la salle, mais je souhaite également ajouter les informations sur l'appartement (qui est l'ID appartement de cet appartement) et la pièce RoomID de la pièce. la table ApartmentRoom dans la base de données et je ne pouvais pas le faire jusqu'à présent.Si je ne me trompe pas jusqu'ici, dans ce cas, que dois-je faire?

  1. Dois-je créer un autre référentiel comme ApartmentRoomRepository implémentant l'interface IRepository et appeler la méthode d'insertion de ApartmentRoomRepository dans la méthode Ajouter dans la RoomController? (Cette approche ne semble pas correcte, pour autant que je comprenne mais je ne suis pas sûr.)
  2. Au lieu de la première option, devrais-je créer ApartmentRoomViewModel? Dans ce cas, comment puis-je insérer ApartmentID de la pièce avec RoomID de la pièce à la table ApartmentRoom?

EDIT 1: J'utilise l'approche Database First.

EDIT 2: J'ai trouvé la solution et partagé comme réponse ci-dessous.

Répondre

0

J'ai réussi à trouver la solution. Tout d'abord, j'ai ajouté une seule ligne à mon fichier AutoMapperProfile.cs.

AutoMapperProfile.cs

public class AutoMapperProfile : Profile 
{ 
    public AutoMapperProfile() 
    { 
     CreateMap<Room, RoomViewModel>().ReverseMap(); 
     CreateMap<Apartment, ApartmentViewModel>().ReverseMap(); 

     // Added this new line 
     CreateMap<ApartmentRoom, ApartmentRoomViewModel>().ReverseMap(); 
    } 
} 

public class AutoMapperConfig 
{ 
    public static void Configure() 
    { 
     Mapper.Initialize(x => 
     { 
      x.AddProfile<AutoMapperProfile>(); 
     }); 
    } 
} 

ApartmentRoom.cs

Cette classe est déjà générée à partir de ma base de données.

public partial class ApartmentRoom 
{ 
    public int Id { get; set; } 
    public int ApartmentID { get; set; } 
    public int RoomID { get; set; } 

    public virtual Apartment Apartment { get; set; } 
    public virtual Room Room { get; set; } 
} 

ApartmentRoomViewModel.cs

j'ai créé cette classe.

public class ApartmentRoomViewModel 
{ 
    public int ApartmentID { get; set; } 
    public int RoomID { get; set; } 
} 

RoomController

J'ai changé à l'intérieur de RoomController un peu. J'ai créé un objet _entities pour pouvoir insérer des données dans le tableau ApartmentRoom.

public class RoomController : Controller 
{ 
    ApartmentManSysEntities _entities = new ApartmentManSysEntities(); 
    private readonly IRoomRepository _roomRepository; 
    private readonly IApartmentRepository _apartmentRepository; 
    public RoomController(IRoomRepository roomRepository, IApartmentRepository apartmentRepository) 
    { 
     _roomRepository = roomRepository; 
     _apartmentRepository = apartmentRepository; 
    } 

    [HttpPost] 
    public JsonResult Add(RoomViewModel roomViewModel) 
    { 
     try 
     { 
      var room = AutoMapper.Mapper.Map<Room>(roomViewModel); 
      if (_roomRepository.Insert(room)) 
      { 
       _roomRepository.Save(); 
       var apartRoomViewModel = new ApartmentRoomViewModel 
       { 
        ApartmentID = roomViewModel.ApartmentNameID, 
        RoomID = room.Id 
       }; 
       var apartRoom = AutoMapper.Mapper.Map<ApartmentRoom>(apartRoomViewModel); 
       _entities.ApartmentRoom.Add(apartRoom); 
       _entities.SaveChanges(); 
      } 
      else 
      { 
       return Json(new { status = false, message = "Hata! Ekleme işlemi gerçekleştirilemedi." }, JsonRequestBehavior.AllowGet); 
      } 
      return Json(new { status = true, message = "Ekleme işlemi başarılı." }, JsonRequestBehavior.AllowGet); 
     } 
     catch 
     { 
      return Json(new { status = false, message = "Hata! Ekleme işlemi gerçekleştirilemedi." }, JsonRequestBehavior.AllowGet); 
     } 
    } 

} 

Après avoir ajouté une nouvelle pièce dans Room table, j'ai appelé la dernière valeur Id de chambre insérée pour faire une nouvelle insertion à la table ApartmentRoom.

Résultat

de table ApartmentRoom

enter image description here

de table de la chambre

enter image description here

+0

je suppose l'ID dans roomViewModel est égal à zéro lorsqu'elle est introduite dans le contrôleur. Peut-être que vous pouvez également essayer quelque chose comme 'Room.ApartmentRoom.ApartmentID = roomViewModel.ApartmentNameID; Room.ApartmentRoom.RoomID = roomViewModel.RoomID; 'Je sais que RoomID est toujours zéro à ce stade, mais lorsque vous ajoutez deux entités et que vous les enregistrez ensuite, la base de données crée l'ID pour vous et attribue automatiquement la valeur correcte. Si vous essayez, laissez-moi savoir ce qui se passe. Je suis intéressé. –

0

Je ne l'ai jamais utilisé la fonction automapper, et avoir des objets model et viewmodel séparés, mais dans ce scénario je voudrais créer un nouvel objet ApartmentRoom ainsi que le nouvel objet Room, de les enregistrer à la fois à la base de données. Le modèle ApartmentRoom qui a été créé est l'emplacement où les informations de liaison sont stockées. EF n'est pas très évident pour les relations plusieurs-à-plusieurs.

0

Si vous êtes sûr de gérer les classes de domaine et les API fluentes, je suppose que ce n'est pas le noyau EF avec lequel vous jouez. Vous pouvez obtenir Apartment de ApartmentRepository puis l'ajouter aux appartements de la chambre et l'ajouter à la base de données.

[HttpPost] 
public JsonResult Add(RoomViewModel roomModel) 
{ 
    try 
    { 
     //var apartViewModel = new ApartmentRoomViewModel(); 
     //apartViewModel.ApartmentID = roomModel.ApartmentNameId; 
     var room = AutoMapper.Mapper.Map<Room>(roomModel); 
     var apart= apartmentRepository.GetById(roomModel.ApartmentNameId); 
     room.Apartments.Add(apart); 
     var status = _roomRepository.Insert(room); 
     _roomRepository.Save(); 
     //apartViewModel.RoomID = room.Id; 

     return Json(new { status, message = "Ekleme işlemi başarılı." }, JsonRequestBehavior.AllowGet); 
    } 
    catch (Exception) 
    { 
     return Json(new { status = false, message = "Hata! Ekleme işlemi gerçekleştirilemedi." }, JsonRequestBehavior.AllowGet); 
    } 
}