2017-02-28 131 views
0

時,我有兩個班,DepartmentEmployeeDbContextEmployeeDbContext並具有所謂EmployeeRepositoryEmployee CRUD操作的存儲庫類遞增。外鍵列不斷更新

然後我創建了一個具有網格視圖,細節視圖和對象數據源的Web窗體。我使用了代碼優先的方法,因此解決方案將自動生成數據庫。我的問題是,無論何時編輯記錄,DepartmentId列都會不斷遞增。我做錯了什麼?

public class Department 
{ 
    public int DepartmentId { get; set; } 
    public string Name { get; set; } 
    public string Location { get; set; } 
    public List<Employee> Employees { get; set; } 

    public Department() 
    { 
     DepartmentId = 0; 
     Name = ""; 
     Location = ""; 
     Employees = new List<Employee>(); 
    } 
} 

public class Employee 
{ 
    public int EmployeeId { get; set; } 
    public string LastName { get; set; } 
    public string FirstName { get; set; } 
    public string MiddleName { get; set; } 
    public string Gender { get; set; } 
    public decimal Salary { get; set; } 
    public int DepartmentId { get; set; } 
    public Department Department { get; set; } 

    public Employee() 
    { 
     EmployeeId = 0; 
     LastName = ""; 
     FirstName = ""; 
     MiddleName = ""; 
     Gender = ""; 
     Salary = 0; 
     DepartmentId = 0; 
     Department = new Department(); 
    } 
} 

public class EmployeeDbContext :DbContext 
{ 
    public DbSet<Employee> Employees { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Employee>().MapToStoredProcedures(); 
     base.OnModelCreating(modelBuilder); 
    } 
} 

public class EmployeeRepository 
{ 
    DemoEnt.EmployeeDbContext employeeDb = new DemoEnt.EmployeeDbContext(); 

    public List<Employee> SelectMany() 
    { 
     try 
     { 
      return employeeDb.Employees.ToList(); 
     } 
     catch (Exception) 
     { 
      return new List<Employee>(); 
     } 
    } 

    public void Insert(Employee param) 
    { 
     employeeDb.Employees.Add(param); 
     employeeDb.SaveChanges(); 
    } 

    public void Update(Employee param) 
    { 
     Employee emp = employeeDb.Employees.FirstOrDefault(x => x.EmployeeId == param.EmployeeId); 

     if (emp != null) 
     { 
      emp.LastName = param.LastName; 
      emp.FirstName = param.FirstName; 
      emp.Gender = param.Gender; 
      emp.Salary = param.Salary; 
      emp.DepartmentId = param.DepartmentId; 
      employeeDb.SaveChanges(); 
     } 
    } 

    public void Delete(Employee param) 
    { 
     Employee emp = employeeDb.Employees.FirstOrDefault(x => x.EmployeeId == param.EmployeeId); 
     if (emp != null) 
     { 
      employeeDb.Employees.Remove(emp); 
      employeeDb.SaveChanges(); 
     } 
    } 
} 

HTML標記:

<body> 
    <form id="form1" runat="server"> 
    <div> 

     <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
      CellPadding="4" DataSourceID="ObjectDataSource1" ForeColor="#333333" 
      GridLines="None"> 
      <AlternatingRowStyle BackColor="White" /> 
      <Columns> 
       <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" /> 
       <asp:BoundField DataField="EmployeeId" HeaderText="EmployeeId" InsertVisible="False" 
        SortExpression="EmployeeId" /> 
       <asp:BoundField DataField="LastName" HeaderText="LastName" 
        SortExpression="LastName" /> 
       <asp:BoundField DataField="FirstName" HeaderText="FirstName" 
        SortExpression="FirstName" /> 
       <asp:BoundField DataField="MiddleName" HeaderText="MiddleName" 
        SortExpression="MiddleName" /> 
       <asp:BoundField DataField="Gender" HeaderText="Gender" 
        SortExpression="Gender" /> 
       <asp:BoundField DataField="Salary" HeaderText="Salary" 
        SortExpression="Salary" /> 
       <asp:BoundField DataField="DepartmentId" HeaderText="DepartmentId" 
        SortExpression="DepartmentId" /> 
      </Columns> 
      <EditRowStyle BackColor="#2461BF" /> 
      <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /> 
      <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /> 
      <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" /> 
      <RowStyle BackColor="#EFF3FB" /> 
      <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" /> 
      <SortedAscendingCellStyle BackColor="#F5F7FB" /> 
      <SortedAscendingHeaderStyle BackColor="#6D95E1" /> 
      <SortedDescendingCellStyle BackColor="#E9EBEF" /> 
      <SortedDescendingHeaderStyle BackColor="#4870BE" /> 
     </asp:GridView> 
     <br /> 
     <asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" 
      BackColor="#DEBA84" BorderColor="#DEBA84" BorderStyle="None" BorderWidth="1px" 
      CellPadding="3" CellSpacing="2" DataSourceID="ObjectDataSource1" 
      DefaultMode="Insert" Height="50px" Width="125px"> 
      <EditRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="White" /> 
      <Fields> 
       <asp:BoundField DataField="EmployeeId" HeaderText="EmployeeId" 
        SortExpression="EmployeeId" InsertVisible="False"/> 
       <asp:BoundField DataField="LastName" HeaderText="LastName" 
        SortExpression="LastName" /> 
       <asp:BoundField DataField="FirstName" HeaderText="FirstName" 
        SortExpression="FirstName" /> 
       <asp:BoundField DataField="MiddleName" HeaderText="MiddleName" 
        SortExpression="MiddleName" /> 
       <asp:BoundField DataField="Gender" HeaderText="Gender" 
        SortExpression="Gender" /> 
       <asp:BoundField DataField="Salary" HeaderText="Salary" 
        SortExpression="Salary" /> 
       <asp:BoundField DataField="DepartmentId" HeaderText="DepartmentId" 
        SortExpression="DepartmentId" /> 
       <asp:CommandField ShowInsertButton="True" /> 
      </Fields> 
      <FooterStyle BackColor="#F7DFB5" ForeColor="#8C4510" /> 
      <HeaderStyle BackColor="#A55129" Font-Bold="True" ForeColor="White" /> 
      <PagerStyle ForeColor="#8C4510" HorizontalAlign="Center" /> 
      <RowStyle BackColor="#FFF7E7" ForeColor="#8C4510" /> 
     </asp:DetailsView> 
     <br /> 
     <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
      DataObjectTypeName="DemoEnt.Employee" DeleteMethod="Delete" 
      InsertMethod="Insert" SelectMethod="SelectMany" 
      TypeName="DemoEnt.EmployeeRepository" UpdateMethod="Update"> 
     </asp:ObjectDataSource> 

    </div> 
    </form> 
</body> 

這裏是自動生成的存儲過程:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[Employee_Update] 
    @EmployeeId [int], 
    @LastName [nvarchar](max), 
    @FirstName [nvarchar](max), 
    @MiddleName [nvarchar](max), 
    @Gender [nvarchar](max), 
    @Salary [decimal](18, 2), 
    @DepartmentId [int] 
AS 
BEGIN 
    UPDATE [dbo].[Employees] 
    SET [LastName] = @LastName, 
     [FirstName] = @FirstName, 
     [MiddleName] = @MiddleName, 
     [Gender] = @Gender, 
     [Salary] = @Salary, 
     [DepartmentId] = @DepartmentId 
    WHERE ([EmployeeId] = @EmployeeId) 
END 

enter image description here

enter image description here

enter image description here

+0

你還需要使用'[關鍵]'屬性你的PK,如'DepartmentId'和''僱員 –

回答

2

您的默認Employee構造函數:

Department = new Department(); 

基本上,如果不與部門查詢員工,你每次執行一個更新時間重新創建部門的員工。我建議你刪除它。也是你做的是使用.Include(...)讓員工與部門:

Employee employee = employeeDb.Employees 
    .Include(employee => employee.Department) 
    .FirstOrDefault(employee => employee.EmployeeId == param.EmployeeId); 
+0

我想這一點。包括(employee => employee.Department),它會產生錯誤。 – Kokombads

+0

使用System.Data.Entity添加''能夠將lamba表達式作爲參數傳遞給'.include'。這應該可以解決這個錯誤。 –