You can use things like SqlDataAdapter, SqlCommand, and SqlConnection to perform tasks against a SQL server (or MySql for that matter) database. If you don't use EF then you take it upon yourself to manage the relationships between entities that are related (navigation properties). EF uses some of these things for you. Here's an excerpt from a program I wrote a very long time ago (it was for a web service but it's just the data access layer portion so it could be used for WinForms) It selects a single question for a quiz from a question pool.
public Question SelectDatabaseRecord(int nId)
{
Question entity;
SqlParamList lstParams;
DataTable dt;
DataSet ds;
DataRow dr;
lstParams = new SqlParamList();
lstParams.AddSqlParam("@Id", DbType.Int32, ParameterDirection.Input, nId);
ds = DataProvider.GetDataSet("spQuestionSelectById", lstParams);
dt = ds.Tables[0];
if (dt.Rows.Count > 0)
{
entity = new Question();
dr = dt.Rows[0];
Populate(ref entity, dr);
return entity;
}
return null;
}
public static DataSet GetDataSet(string strProcName, List<SqlParameter> lstParams)
{
DataSet dsResult = new DataSet();
SqlConnection conn = GetConnection();
SqlDataAdapter da;
if (conn != null)
{
conn.Open();
da = new SqlDataAdapter(strProcName, conn);
da.SelectCommand = conn.CreateCommand();
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.SelectCommand.CommandText = strProcName;
if (lstParams != null)
foreach (SqlParameter sqlParam in lstParams)
da.SelectCommand.Parameters.Add(sqlParam);
da.Fill(dsResult);
da.SelectCommand.Dispose();
conn.Close();
conn.Dispose();
}
return dsResult;
}