1

我正嘗試使用BLL,DAL和UI構建三層體系結構。我正在開發一個小型的公寓管理系統項目(其中包括關於居住學生,他們的房間和他們住的房間的公寓)的信息。由於我是初學者,我有一些技術問題需要解決。我正在使用實體框架與存儲庫模式。我的項目是基於MVVM的方法,我使用的是Automapper帶有存儲庫模式的實體框架,將數據插入到具有多對多關係的表中

代碼爲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>(); 
     }); 
    } 
} 

我想一個新的房間添加到我的數據庫。還有就是我的房間和公寓表之間的許多一對多的關係,我的數據庫是這樣的:

My Database's screen shot

我IRepository接口的樣子:

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

我有RoomRepository和ApartmentRepository,都實現了IRepository接口。我已經創建了我的資料庫和基礎設施:

基礎設施(文件夾)

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

Reposi保守黨(文件夾)

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

增加了一條新的房間,管理員必須註明哪個公寓那個房間屬於。在RoomController內的添加方法如下:

[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

我的問題是,當我想插入數據我ta在房間添加頁面中,我可以將收集到的房間信息添加到房間表中,但我也想將該房間的公寓信息(該房間的ApartmentID)和同一房間的房間ID添加到數據庫中的ApartmentRoom表,我目前無法做到這一點。如果我沒有錯,到目前爲止,在這種情況下,我應該怎麼辦?

  1. 我應該建立另一個倉庫一樣ApartmentRoomRepository實現IRepository接口,並調用ApartmentRoomRepository的插入方法在RoomController內部Add方法? (這種方法似乎不是一個正確的一個,據我理解,但我不知道。)
  2. 取而代之的是第一個選項,我應該創建ApartmentRoomViewModel?在這種情況下,我怎麼能插入ApartmentID的房間,房間的RoomID到ApartmentRoom表?

編輯1:我使用的數據庫第一種方法。

編輯2:我已找到解決方案並作爲答案共享下面。

回答

0

我已經設法找到解決方案。首先,我已將一行添加到我的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

這個類是已經從我的數據庫生成的。

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

我創造了這個類。

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

RoomController

我已經改變了RoomController一點內部。我創建了一個_entities對象,以便能夠將數據插入到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); 
     } 
    } 

} 

後,我增加了一個新的房間變成Room表,我叫最後插入房間的ID值做出新的插入到ApartmentRoom表。

結果

ApartmentRoom表

enter image description here

間表

enter image description here

+0

我假定在roomViewModel ID爲0時插入到該控制器。也許你也可以嘗試像'Room.ApartmentRoom.ApartmentID = roomViewModel.ApartmentNameID; Room.ApartmentRoom.RoomID = roomViewModel.RoomID;'我知道RoomID在這一點上仍然是零,但是當你添加兩個實體然後保存它們時,db會爲你創建id並自動分配正確的值。如果你嘗試,讓我知道發生了什麼。我有興趣。 –

0

我從來沒有使用automapper功能,並有獨立的modelviewmodel對象,但在這種情況下我會創建一個新的ApartmentRoom對象以及新Room對象,他們兩個保存到數據庫中。已創建的ApartmentRoom模式是鏈接信息的存​​儲位置。 EF不是很多一對多的關係非常明顯。

0

如果您確定處理領域類和流利API,我也認爲它不是您玩的EF核心。你可以從公寓然後ApartmentRepository它添加到房間的公寓,並把它添加到數據庫中。

[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); 
    } 
} 
相關問題