实体框架:将多个类似的类映射到类似数据库中的一个表

时间:2017-08-30 08:59:16

标签: c# entity-framework

我的客户数据库中有表格模型:

public class Doctor
{
    public int Id { get; set; }
    public int Filial { get; set; }
    public string ShortName { get; set; }
    public string FullName { get; set; }
    public string Phone { get; set; }

    public int? DepartmentId { get; set; }
    public Department Department { get; set; }
}

public class DoctorConfiguration : EntityTypeConfiguration<Doctor>
{
    public DoctorConfiguration()
    {
        ToTable("DOCTOR");
        Property(d => d.Id).HasColumnName("DCODE").IsRequired();
        Property(d => d.Filial).HasColumnName("FILIAL");
        Property(d => d.ShortName).HasColumnName("DNAME");
        Property(d => d.FullName).HasColumnName("FULLNAME");
        Property(d => d.Phone).HasColumnName("DPHONE");

        Property(d => d.DepartmentId).HasColumnName("DEPNUM");            

        HasKey(d => d.Id);            
        HasOptional(d => d.Department).WithMany(dep => dep.Doctors).HasForeignKey(d => d.DepartmentId);            
    }

}

最近有更多客户来了。他们的数据库大多数都是相同的模型,但有些字段已经从int更改为long。 新的Doctor模型看起来像:

public class Doctor
{
    public long Id { get; set; }
    public long Filial { get; set; }
    public string ShortName { get; set; }
    public string FullName { get; set; }
    public string Phone { get; set; }

    public long? DepartmentId { get; set; }
    public Department Department { get; set; }
}

如何将新的Doctor模型格式正确映射到同一个表格&#34; DOCTOR&#34;?

该应用程序使用Firebird数据库。版本为&#34; old&#34;客户不支持长数字格式。

如果创建类似的Doctor配置,则会出现错误: &#34;实体类型&#39; DoctorInt&#39;和&#39;医生&#39;不能分享表格&#39; DOCTOR&#39;因为它们不在同一类型层次结构中,或者没有有效的一对一外键关系,并且它们之间具有匹配的主键。&#34;

我知道每层次表(TPH)继承。看起来它在这种情况下无能为力。

Doctor类型只是具有此问题的众多类似类型中的一种。应用程序中的代码与第一个模型格式相关联。我不想改变一切...... 我想重用现有的功能。

1 个答案:

答案 0 :(得分:0)

如果我没有误解,你需要支持具有相同代码的新旧数据库,数据库只有ID大小不同

一种方法是使用泛型和条件编译

public class Doctor<T> {
    public T Id { get; set; }
    public int Filial { get; set; }   //Suposing Filial is not a foreing key
    public string ShortName { get; set; }
    public string FullName { get; set; }
    public string Phone { get; set; }

    public T? DepartmentId { get; set; }
    public Department Department { get; set; }

}

在讨论时:

#ifdef USELONG
var d = new Doctor<long>();
#else
var d = new Doctor<int>();
#endif

或者使用工厂模式(其中CreateDoctor可能是Doctor类的静态方法):

var d = Doctor.CreateDoctor();