2017-08-17 36 views
0

我有兩個類如何分享實體及其他實體可以使用它(一個=>多)

第一個是員工

public class Employee 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

二是合同

public class Contract 
{ 
    public int Id { get; set; } 
    public string Desc { get; set; } 
} 

我需要在每個合同和員工中存儲一些文件(一名員工可以附加0個或更多文件(他的簡歷,掃描的身份證件等),並且合同可以附加0到多個文件CT,掃描的合同附件))

我有這個想法創建分隔的類文件,對於像

的員工每個班級我應該創建

public class EmployeeFile 
{ 
    public byte[] file { get; set; } 
    public Employee Employee { get; set; } 
} 

的合同,我應該創建

public class ContractFile 
{ 
    public byte[] file { get; set; } 
    public Contract Contract { get; set; } 
} 

我的問題是如何創建只有一個類的文件存儲使用它的所有類,所以我不會重複我的自我,像這個類

public class File 
{ 
    public byte[] file { get; set; } 
    public Object Object { get; set; } 
} 

回答

0

爲了它,你想,你可以使用泛型

public class File<T> { 
    public byte[] file {get;set;} 
    public T Host {get;set;} 
} 

或者你也可以把它周圍和收集屬性添加到每個需要的文件

public class Employee { 
    public byte[] file{get;set;} 
    public Employee Employee{get;set;} 
    public File[] Files{get;set;} 
} 

爲了讓更多的類通用你可以從一個普通類繼承那些類,或實現接口

public interface IFileHolder { 
    public File[] Files{get;set;} 
} 
public class Employee : IFileHolder 

在接口使用的情況下,你可以添加到迭代通過量所有的父母,並返回一個有效

public class File { 
    public byte[] file {get;set;} 
    public Employee Employee {get;set;} 
    public Contract Contract {get;set;} 

    public IFileHolder Host{ 
     get{ return Employee ?? Contract; } 
    } 
} 
+0

感謝您的回答,如果我想將這些文件保存到數據庫中,那麼員工將數據保存在表中僱員和其他類相同合同和文件 –

+0

關係數據庫中,您最有可能使用,你將不得不爲'File'創建一個單獨的表,該表對每個表都應該有一個FK,它應該使用文件。在這種情況下,類「File」必須爲每種類型的父對象具有單獨的屬性。但是在大多數情況下它將是空的,並且每個Host對象都有一個文件集合。在那種情況下,如果你仍然需要一些泛化,你可以使用接口 – ASpirin

0

唉,實體框架不能很好地與泛型類工作中的File類的函數。

但是,您可以在其他答案之一中使用ASpirin的想法,並從泛型類派生具體類(=將成爲表的類),並讓這些派生類型的類爲DbSet

看看你的設計,看起來,目前EmployeeFileContractFile具有相同的結構,所以這可以工作。

但是您還應該檢查這種類似的結構是否意外,或者您是否真的認爲每個EmployeeFile現在和將來都應該具有與ContractFile相同的結構和功能?

如果沒有,請重新考慮您爲此使用泛型類的決定。

您可能會在DB端(AsQueryable)和/或本地內存(AsEnumerable)中執行函數。數據庫查詢不會理解泛型類,因此泛型功能只能執行AsEnumerable。

不要從派生自泛型類的表中實現您的表,請考慮從兩個類中提取事物,這些類作爲公共基類非常常見。數據庫表格可能仍然有EmployeeFiles表格和ContractFiles表格。使用design model Table Per Concrete class (TPC)

最好讓您的類成爲類似於您的數據庫表的簡單POCO。這樣,這些類可以被其他使用相同數據庫的用戶重用,而不需要您的功能,這可能會限制他們對數據的使用。

另一方面,您可以使用該類上的擴展功能來擴展POCO類的功能(類似於類Enumerable擴展了IEnumerable的功能)。請參閱Extension Functions Demystified

相關問題