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); 
    } 
} 
相关问题