我是一个新的实体框架..我正在为一个小项目编写代码,我有一个基础表员工,从中派生出一个contractEmployee表和dailypaidEmployee表。
public class Employee
{
[Column(Order=1)]
public int ID { get; set; }
[Column(Order = 2)]
public string EmpName { get; set; }
[Column(Order = 3)]
public string Mobile { get; set; }
[Column(Order = 4)]
public DateTime HiringDate { get; set; }
[Column(Order = 5)]
public int DepartmentID { get; set; }
[Column(Order = 6)]
public int PositionID { get; set; }
}
public class ContractEmployee : Employee
{
[Column(Order = 7)]
public string Code { get; set; }
[Column(Order = 8)]
public string Grade { get; set; }
}
public class DailyPaidEmployee : Employee
{
[Column(Order = 9)]
public int DailyPaidAmount { get; set; }
}
public class AttendanceManagementDBContext : DbContext
{
public AttendanceManagementDBContext()
: base("name=AttendanceManagementDBContext")
{
Configuration.LazyLoadingEnabled = false;
Configuration.ProxyCreationEnabled = false;
}
public DbSet<Employee> Employees { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Employee>().ToTable("Employee");
modelBuilder.Entity<ContractEmployee>().ToTable("ContractEmployee");
modelBuilder.Entity<DailyPaidEmployee>().ToTable("DailyPaiedEmployee");
base.OnModelCreating(modelBuilder);
}
}
public class UnitOfWork : IUnitOfWork
{
private readonly AttendanceManagementDBContext _Context;
public UnitOfWork(AttendanceManagementDBContext Context)
{
_Context = Context;
Employees = new EmployeeRepository(Context);
}
public IEmployeeRepository Employees { get; private set; }
public int Complete()
{
return _Context.SaveChanges();
}
}
void InsertingNewContractEmployee()
{
UnitOfWork uow = new UnitOfWork(new AttendanceManagementDBContext());
ContractEmployee ce = new ContractEmployee();
ce.EmpName = txtEmpName.Text;
ce.Mobile = txtMobile.Text;
ce.HiringDate = DateTime.Parse(dtHiringDate.Value.ToShortDateString());
ce.DepartmentID = (int)cbDepartments.SelectedValue;
ce.PositionID = (int)cbPositions.SelectedValue;
ce.Code = txtCode.Text;
ce.Grade = txtGrade.Text;
uow.Employees.Add(ce);
uow.Complete();
}
void InsertingNewDailyPaidEmployee()
{
UnitOfWork uow = new UnitOfWork(new AttendanceManagementDBContext());
DailyPaidEmployee dpe = new DailyPaidEmployee();
dpe.EmpName = txtEmpName.Text;
dpe.Mobile = txtMobile.Text;
dpe.HiringDate = DateTime.Parse(dtHiringDate.Value.ToShortDateString());
dpe.DepartmentID = (int)cbDepartments.SelectedValue;
dpe.PositionID = (int)cbPositions.SelectedValue;
dpe.DailyPaidAmount = int.Parse(txtDailyPaid.Text);
uow.Employees.Add(dpe);
uow.Complete();
}
我以成功的方式进行添加和更新过程,我的问题是当我想将dailypaidEmployee移动到ContractEmployee时,我不知道如何制作它。我试图将员工从其无法工作的日常员工中删除,所以我能做些什么。
答案 0 :(得分:1)
当然,技术上你可以。即使在C#的打字环境中,你也可以。例如,您可以将整数(排序)更改为小数。这称为转换。反过来,从十进制转换为整数,可以作为转换类型时可能遇到的问题的小例子:小数不适合。它们可能太大,或者它们会失去精度(转换不会无损)。
同样,可以将DailyPaidEmployee
转换为ContractPaidEmployee
,方法是通过简单的SQL语句(不是EF)更改其鉴别符值,并重新读取数据库中的实体( EF)。但是,您最终会得到一个代表ContractEmployee
但值DailyPaidAmount
的数据库记录。
即使应用程序没有注意到 - EF不会读取该值 - 它可能会在以后出现意外问题。当你特别不等待它们时,这些问题总会出现。
底线是:当实体可以更改&#34;类型&#34;,即使不经常,也不要使用继承。而是将类型视为状态:DailyPaidEmployee
可以提升(不是转换)到ContractPaidEmployee
,只需翻转状态标记即可。< / p>
至于细节:将它们移到单独的表中。 Employee
将成为稳定的数据点。它可能包含也可能没有DailyPayment
表或Contract
表中的数据。当员工的状态发生变化时,您可以添加其第一个Contract
,也可以删除其DailyPayment
数据。
行为的差异(通常是使用继承和多态的主要原因)可以通过其他行为模式建模,例如Strategy。