如何共享实体和其他实体可以使用它(一个=>多个)

时间:2017-08-17 17:56:59

标签: c# entity-framework

我有两个班级

第一个是员工

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到多个文件(签订合同,扫描合同附录))

我有想法为每个类创建单独的类文件,如

for Employee我应该创建

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

2 个答案:

答案 0 :(得分:0)

要按照您的意愿制作,可以使用Generics

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

如果是接口使用,您可以添加到File类函数中,该函数遍历所有父项并返回有效的

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

答案 1 :(得分:0)

唉,实体框架与泛型类不兼容。

但是,您可以在其他一个答案中使用ASpirin的想法,并从泛型类派生您的具体类(=将成为表的类),并让这些派生类型的DbSet类。 / p>

看看你的设计,似乎暂时EmployeeFile具有与ContractFile相同的结构,所以这可行。

但是你还应该检查这个类似的结构是否是偶然的,或者你真的认为每个EmployeeFile应该具有与ContractFile相同的结构和功能,现在和将来?

如果没有,请重新考虑您为此使用泛型类的决定。

您可能会在DB端(AsQueryable)和/或本地内存(AsEnumerable)中执行功能。数据库查询不会理解泛型类,因此通用功能只能执行AsEnumerable。

不要将表实现为派生自泛型类,而应考虑从两个类中提取事物作为公共基类。数据库表可能仍有EmployeeFiles表和ContractFiles表。使用design model Table Per Concrete class (TPC)

最好让您的类成为与数据库表类似的简单POCO。这样,这些类可以被使用相同数据库的其他人重用,而不需要您的功能,这可能会限制他们对数据的使用。

另一方面,您可以使用类上的扩展函数扩展POCO类的功能(类似于类Enumerable扩展了IEnumerable的功能)。见Extension Functions Demystified