EF wstawienie wiersza do tabeli

0

Witam.
Mam tabelę, z polami (przykładowo):
id, part_number, name, supplier_id, status_id, creation_date

Na formie mam textBoxy i comboboxy (wypełnione wartościami zaciąganymi z tabel w bazie - jeden combobox nazwy {supplier_name}, drugi combobox statusy {status_name}).
W jaki sposób wstawić do bazy nowy rekord?

Mam metodę ale nie mam wartości (supplier_id, status_id) - jak je w łatwy sposób wyciągnąć z bazy bez dodatkowych selectów?

 public static int  AddToDatabase(string partNumber, string name, string supplier, string status, DateTime creationDate)
{
	//zapisa danych do bazy danych
	try
	{
		using (atraceEntities ent = new atraceEntities())
		{
			materials material = new materials
			{
				part_number = partNumber,
				name = name,
				supplier_id = ???	//tutaj powinen być supplier_id a mam supplier_name z combobox
				status_id = ???		//tutaj powinien być status_id a mam status_name z combox
				creation_date = creationDate
			};
			ent.materials.Add(material);
			ent.SaveChanges();
		}
		return 0;
	}
	catch (Exception ex)
	{
		Console.WriteLine(ex.Message);
		return -1;
	}
} 
0

W comboboxie masz takie pole jak SelectedValue w nim powinieneś przechowywać te informacje. Aby to zrobić musisz przypisać jaka wartość ma być przechowywana. Poszukaj info o comboBox.ValueMember ;

0

W sumie to wystarczy dodać:

 var supplier2 = ent.suppliers.Where(s => s.name == supplier).Select(p => p.id).First();

i podstawić w odpowiednie miejsce:

 supplier_id = supplier2,   //tam gdzie było supplier_id = ???
1

Ogólnie to złe rozwiązanie.
Po pierwsze co gdy suppliers będzie dwóch o takiej samej nazwie? Po to jest ten identyfikator żeby określać unikalność wiersza.
Po drugie to zbędne odwołanie ponownie do bazy żeby pobrać dane. Przecież już je pobierasz przy wypełnianiu ComboBoxów.

a i nawiasem mowiąc to dlaczego nie przekazujesz od razu obiektu materials do tej funkcji? Nie jest dobrą praktyką tworzenie funkcji z taką ilościa parametrów. Nazwę klasy piszemy z dużych liter.

0

To prawda pobieram. Na razie jeszcze nie wiem jak wykorzystać "ValueMember" - jak pobrać dane z bazy i wstawić do itemów comboboxa i dodać jeszcze ValueMember. Jak się dowiem to pewnie zastosuje Twoje rozwiązanie.

0

Możesz zrobić to tak, że do DataSource przypisujesz swoją liste, a w DisplayMember podajesz właściwość jaka ma być wyświetlona w combobox

cmb.DataSource=list;
cmb.DisplayMember=propertyName;

Wtedy w swoim combobox masz listę obiektów i żeby wyciągnąć jakieś dane robisz rzutowanie SelectedValue i dalej operujesz na swoim obiekcie, np żeby wyciągnąć ID robisz tak:

((TypObjektu)cmb.SelectedValue).ID; 

1 użytkowników online, w tym zalogowanych: 0, gości: 1