2017-08-17 38 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

相关问题