我的客户数据库中有表格模型:
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类型只是具有此问题的众多类似类型中的一种。应用程序中的代码与第一个模型格式相关联。我不想改变一切...... 我想重用现有的功能。
答案 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();