#c# #asp.net #entity-framework #webforms #entity-framework-6
#c# #asp.net #entity-framework #веб-формы #entity-framework-6
Вопрос:
Я новичок в EF, и мне нужно внести изменения в существующий с EF в asp.net webform 4.5
Я могу отображать данные в элементе управления повторителем, извлекать данные из выпадающего списка, но по какой-то причине я не могу сохранить данные для Employee, я не получаю никаких ошибок, и когда я проверяю SQL Profiler, он не показывает никакой хранимой процедуры Insert в списке сведений, которые он показывает.
Я делаю что-то не так или мой подход неправильный
App_Code
DBClass
Department.cs
Employee.cs
EmployeeDBContent.cs
EmpRepository.cs
Код для всех файлов
EmployeeDBContext.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using empNS;
/// <summary>
/// Summary description for EmployeeDBContext
/// </summary>
///
namespace empNS
{
public class EmployeeDBContext : DbContext
{
public DbSet<Department> Departments { get; set; }
public DbSet<Employee> Employees { get; set; }
public EmployeeDBContext()
: base("EmployeeDBContext")
{
//disable initializer
Database.SetInitializer<EmployeeDBContext>(null);
}
}
//protected override void OnModelCreating(DbModelBuilder modelBuilder)
//{
// base.OnModelCreating(modelBuilder);
//}
}
EmpRepository.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
/// <summary>
/// Summary description for EmpRepository
/// </summary>
///
namespace empNS
{
public class EmpRepository
{
public static List<Employee> GetEmployees()
{
EmployeeDBContext empDBContext = new EmployeeDBContext();
return empDBContext.Employees.ToList();
}
public static List<Department> GetDepartments()
{
EmployeeDBContext empDBContext = new EmployeeDBContext();
return empDBContext.Departments.ToList();
}
public static List<Department> GetDepartmentNames()
{
EmployeeDBContext empDBContext = new EmployeeDBContext();
return empDBContext.Departments.ToList();
}
public static void InsertEmployee(Employee employee )
{
EmployeeDBContext empDBContext = new EmployeeDBContext();
empDBContext.SaveChanges();
}
}
}
Department.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
/// <summary>
/// Summary description for Dept
/// </summary>
///
namespace empNS
{
public class Department
{
//Scalar properties
public int Id { get; set; }
public string Name { get; set; }
public string Location { get; set; }
//Navigation Property
public List<Employee> Employees { get; set; }
}
}
employee.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations.Schema;
/// <summary>
/// Summary description for Emp
/// </summary>
///
namespace empNS
{
public class Employee
{
//Scalar Properties
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Designation { get; set; }
public int Department_Id { get; set; }
//Navigation Property
[ForeignKey("Department_Id")]
public Department Department { get; set; }
}
}
Employee.aspx
<h1>Employee List</h1>
<asp:Repeater ID="rptEmpList" runat="server" >
<ItemTemplate>
<p><%#Eval("Id") %> | <%#Eval("FirstName") %> | <%#Eval("LastName") %></p>
</ItemTemplate>
</asp:Repeater>
<h1>SAVE EMPLOYEE</h1>
<p>FN: <asp:TextBox ID="txtFN" runat="server"></asp:TextBox></p>
<p>LN: <asp:TextBox ID="txtLN" runat="server"></asp:TextBox></p>
<p>Des: <asp:TextBox ID="txtDes" runat="server"></asp:TextBox></p>
<p>Dept: <asp:DropDownList ID="ddDept" runat="server"></asp:DropDownList></p>
<p><asp:Button ID="btnSaveEmployee" runat="server" Text="Save Employee" OnClick="btnSaveEmployee_Click" /></p>
Employee.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using empNS;
public partial class EmployeePage : System.Web.UI.Page
{
Employee empObj = new Employee();
protected void Page_Load(object sender, EventArgs e)
{
rptEmpList.DataSource = EmpRepository.GetEmployees();
rptEmpList.DataBind();
//fill DD
getDepartmentNames();
}
public void getDepartmentNames()
{
ddDept.DataSource = EmpRepository.GetDepartmentNames();
ddDept.DataTextField = "Name";
ddDept.DataValueField = "Id";
ddDept.DataBind();
}
protected void btnSaveEmployee_Click(object sender, EventArgs e)
{
empObj.FirstName = txtFN.Text;
empObj.LastName = txtLN.Text;
empObj.Designation = txtDes.Text;
empObj.Department_Id = int.Parse(ddDept.SelectedItem.Value.ToString());
EmpRepository.InsertEmployee(empObj);
}
}
Комментарии:
1. Ваша функция InsertEmployee ничего не делает (особенно с данным сотрудником). Вы должны добавить его в набор баз данных контекста.
2. Вы имеете в виду это
public static void InsertEmployee(Employee employee ) { EmployeeDBContext empDBContext = new EmployeeDBContext(); empDBContext.SaveChanges(); }
3. вы вставляете функцию Employee, пропуская строку
empDBContext .Employee.Add(employee );
передSaveChanges();
. Также я думаю, что вам следует включить намерение EmployeeDBContext с использованием statment
Ответ №1:
Это
public static void InsertEmployee(Employee employee )
{
EmployeeDBContext empDBContext = new EmployeeDBContext();
empDBContext.SaveChanges();
}
Должно быть это:
public static void InsertEmployee(Employee employee )
{
EmployeeDBContext empDBContext = new EmployeeDBContext();
empDBContext.Employees.Add(employee);
empDBContext.SaveChanges();
}
Редактировать
Убедитесь, что у вас также правильно объявлены ваши наборы баз данных. В вашем случае это должно быть что-то вроде:
DbSet<Employee> Employees { get; set; }
Комментарии:
1. Когда я добавляю это, я получаю сообщение об ошибке `Сообщение об ошибке компилятора: CS1061: ’empNS.EmployeeDBContext’ не содержит определения для ‘Employee’ и не удалось найти метод расширения ‘Employee’, принимающий первый аргумент типа ’empNS.EmployeeDBContext’ (вам не хватает директивы using или ссылки на сборку?)
2. empDBContext.Employee s . Добавить (сотрудника);
3. Да, я понимаю, что это должно быть
Employees
. оценено4. Отредактировал мой ответ
5. Я думаю, что мой DbSet объявлен так, как вы упомянули в моем коде ` public DbSet<Employee> Employees { get; set; }, если вы не имели в виду что-то другое