時,我有兩個班,Department
和Employee
和DbContext
類EmployeeDbContext
並具有所謂EmployeeRepository
的Employee
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
你還需要使用'[關鍵]'屬性你的PK,如'DepartmentId'和''僱員 –