2016-05-21 2 views
1

Мой проект C# Windows Application, я использую Entity Framework 5 и .net 4.5.Entity Framework сохраняет только последнюю строку (основные данные)

У меня есть номера и модуль кровати, которые можно добавлять, редактировать и удалять номера (ов) и/или (ые) кровать

на моей форме У меня есть поле для RoomNo и станции, а также Добавить и Удалить добавлять/удалять слой (ы) в DataGridView

DB Structure 

Rooms (table) 
PK_Rooms 
FK_Station 
RoomNo 

Beds (table) 
PK_Beds 
FK_Rooms 
BedNo 
FullRoomNo (concat only of Roomno and Bedno) 
RoomStatus 

ниже мой метод Add, чтобы добавить комнату и кровати в DB

M3dEntities m3d = new M3dEntities(); 
rooms rooms = new rooms(); 
beds beds = new beds(); 

string RoomNo = RoomNoTxt.Text; 
     int StationID = Int32.Parse(StationCmb.SelectedValue.ToString()); 

     var roomnoexist = from g in m3d.rooms 
          where g.RoomNo == RoomNo 
          select g; 

     if (roomnoexist.Any()) 
     { 
      MessageBox.Show("Room No. Already Exist!"); 
     } 
     else 
     { 
      rooms.RoomNo = RoomNo; 
      rooms.FK_Stations = StationID; 

      m3d.rooms.AddObject(rooms); 
     } 

     foreach (DataGridViewRow row in BedsDataGridView.Rows) 
     { 
      beds.Bedno = row.Cells[0].Value.ToString(); 
      beds.FullRoomNo = row.Cells[1].Value.ToString(); 
      beds.RoomStatus = "Available"; 
      m3d.beds.AddObject(beds); 
     } 

     m3d.SaveChanges(); 

(Ex: добавить номер 1201 с 4-мя кроватями) Onl y последний ряд постели сохраняется в DB.

Мои вопросы:

  1. Почему только сохранить последнюю строку?
  2. Как сохранить все ряды на кровати?
  3. Как я могу это сделать для метода редактирования (Чтобы добавить еще одну кровать или удалить кровать в текущей комнате)?
+1

Что такое 'метод m3d.beds.AddObject'? –

+0

Следуйте этой статье msdn шаг за шагом, и вы узнаете больше об инфраструктуре сущности и детализации. [Связывание данных с WinForms] (https://msdn.microsoft.com/en-us/data/jj682076.aspx) –

+2

Вы должны создать новые объекты «кроватей» внутри цикла. Теперь вы повторно используете один объект. Также сделайте себе одолжение и используйте уникальные имена для классов/объектов и множественные имена для коллекций. –

ответ

0

Вы должны переместить beds beds = new beds(); инструкции внутри foreach заявление так:

foreach (DataGridViewRow row in BedsDataGridView.Rows) 
{ 
    beds beds = new beds(); // Here is its place. 
    beds.Bedno = row.Cells[0].Value.ToString(); 
    beds.FullRoomNo = row.Cells[1].Value.ToString(); 
    beds.RoomStatus = "Available"; 
    m3d.beds.AddObject(beds); 
} 

Wihtout, что вы всегда oiverriden последней инстанции beds, которые в конечном итоге, содержащий вашу последнюю строку и сохранить только эту строку.

Side Примечание:, чтобы получить некоторую пользу производительности AddRange при вставке нескольких объектов сразу, как это:

var bedsCollection = new List<beds>(); 
foreach (DataGridViewRow row in BedsDataGridView.Rows) 
{ 
    beds beds = new beds(); // Here is its place. 
    beds.Bedno = row.Cells[0].Value.ToString(); 
    beds.FullRoomNo = row.Cells[1].Value.ToString(); 
    beds.RoomStatus = "Available"; 
    bedsCollection.Add(beds); // update the collection not the DbSet 
} 

m3d.beds.AddRange(bedsCollection); 
m3d.SaveChanges(); 
+0

Большое спасибо CodeNotFound! вы спасли меня по моей проблеме. Однако моя следующая проблема связана с моим вопросом № 3. Можете ли вы дать мне представление о том, как это сделать? Еще раз спасибо :) – Henry

+0

Вопрос №3 нужен код, уже написанный для показа, и где yoy stick. Пожалуйста, создайте для этого еще один поток, и я помогу вам там. Если вы считаете, что этот ответ удовлетворил вас, тогда принимайте его как ответ. – CodeNotFound

+0

В любом случае, если вам нужно снять кровать, просто снимите кровать и сделайте следующее: 'm3d.beds.Remove (beds);' – CodeNotFound

Смежные вопросы