2017-08-30 77 views
1

我有表模型在我的客戶數據庫:實體框架:在類似的數據庫映射多個類似的類一個表

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。 新的醫生模型的樣子:

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; } 
} 

如何將新的醫生模型格式正確映射到同一個表「醫生」?

該應用程序使用Firebird數據庫。 「舊」客戶端版本不支持長數字格式。

如果創建了類似的Doctor配置,則會出現一個錯誤: 「實體類型'DoctorInt'和'Doctor'不能共享表'DOCTOR',因爲它們不在同一類型層次結構中或者沒有有效的到一個具有匹配的主鍵的外鍵關係。「

我知道關於逐層次表(TPH)的繼承。看起來在這種情況下它不起作用。

Doctor的類型只是這個問題的許多類似類型之一。應用程序中的代碼與第一個模型格式相關聯。我不想改變這一切... 我想重用現有的功能。

+0

假設ID字段是主鍵我不認爲你可以。 –

+0

可以肯定......你有'int'和'long',但你只能期望int兼容值,對吧?另外,我還沒有真正理解你的場景......都是應該在相同的應用程序中存在的醫生類,在相同的DbContext中,針對不同的(但相似的)數據庫或完全相同的數據庫實例? ... – grek40

+0

@ grek40我想,在這種情況下,我必須具有「int」和「long」兼容值。舊客戶端擁有Firebird數據庫的版本,其中「long」不受支持。新客戶端擁有'long'數據庫版本。我可以在代碼中將int轉換爲long。代碼中的操作將會「長」。 「 – Andriy

回答

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; } 

} 

當istantiating:

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

或用一個工廠模式(其中CreateDoctor可以是醫生類的一個靜態方法):

var d = Doctor.CreateDoctor(); 
+0

感謝您的回答,但實施此方法後,錯誤上升:「類型' Schedule.DB.Models.Doctor'1 [System.Int32]'未映射。請檢查該類型是否未使用Ignore方法或NotMappedAttribute數據註釋明確排除。驗證類型被定義爲一個類,不是原始的或通用的,並且不從EntityObject繼承。「看起來像泛型類不支持作爲實體框架中的模型:https://stackoverflow.com/questions/21513534/ -generic類 - 不支持-AS-模型,在實體框架 – Andriy

相關問題