从dreived表中删除行而不使用实体框架从基表中删除它

时间:2017-02-11 13:58:59

标签: entity-framework

我是一个新的实体框架..我正在为一个小项目编写代码,我有一个基础表员工,从中派生出一个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时,我不知道如何制作它。我试图将员工从其无法工作的日常员工中删除,所以我能做些什么。

1 个答案:

答案 0 :(得分:1)

You can't change types。周期。

当然,技术上你可以。即使在C#的打字环境中,你也可以。例如,您可以将整数(排序)更改为小数。这称为转换。反过来,从十进制转换为整数,可以作为转换类型时可能遇到的问题的小例子:小数不适合。它们可能太大,或者它们会失去精度(转换不会无损)。

同样,可以DailyPaidEmployee转换为ContractPaidEmployee,方法是通过简单的SQL语句(不是EF)更改其鉴别符值,并重新读取数据库中的实体( EF)。但是,您最终会得到一个代表ContractEmployee但值DailyPaidAmount的数据库记录。

即使应用程序没有注意到 - EF不会读取该值 - 它可能会在以后出现意外问题。当你特别等待它们时,这些问题总会出现。

底线是:当实体可以更改&#34;类型&#34;,即使不经常,也不要使用继承。而是将类型视为状态DailyPaidEmployee可以提升(不是转换)到ContractPaidEmployee,只需翻转状态标记即可。< / p>

至于细节:将它们移到单独的表中。 Employee将成为稳定的数据点。它可能包含也可能没有DailyPayment表或Contract表中的数据。当员工的状态发生变化时,您可以添加其第一个Contract,也可以删除其DailyPayment数据。

行为的差异(通常是使用继承和多态的主要原因)可以通过其他行为模式建模,例如Strategy