考虑3类:Person
,Company
和File
。EF代码优先:具有多个多对一关系的实体类型
Person
和Company
是完全不同且无关的,但它们每个都有一个File
对象的集合。无论它属于哪个实体,File
总是具有相同的结构。
这个问题是关于如何最好地模拟File
可以具有的多对多关系;在这种情况下,File
可以与Person
或Company
(但不在同一实例中)具有多对一的关系。
方法1:
class Person
{
public int Id {get;set;}
public ICollection<File> Files {get;set;}
}
class Company
{
public int Id {get;set;}
public ICollection<File> Files {get;set;}
}
class File
{
public int Id {get;set;}
public string Path {get;set;}
}
/*
EF Generates:
-----------------
Table: Person (Id)
Table: Company (Id)
Table: File (Id, Path, Person_Id, Company_Id)
*/
这似乎是最简单的,并从代码最简单的第一视角,这是我最喜欢的。问题是表File
,它具有Person_Id和Company_Id的无效字段。从数据库设计的角度来看,这看起来是错误的,考虑到两个字段中只有一个字段会有值,而另一个永远是空的。使用文件集合添加更多类会更加激化问题。
方法2:
class Person
{
public int Id {get;set;}
public ICollection<PersonFile> Files {get;set;}
}
class Company
{
public int Id {get;set;}
public ICollection<CompanyFile> Files {get;set;}
}
class File
{
public int Id {get;set;}
public string Path {get;set;}
}
class PersonFile
{
public Person Person {get;set;}
public File File {get;set;}
}
class CompanyFile
{
public Company Company {get;set;}
public File File {get;set;}
}
/*
EF Generates:
------------------
Table: Person (Id)
Table: Company (Id)
Table: File (Id, Path)
Table: PersonFile (Person_Id, File_Id)
Table: CompanyFile (Company_Id, File_Id)
*/
这样可以完成同样的事情方法1,并且是接近我已经在第一DB传统设计完成。但它需要两个额外的类,我真的不需要......或者我呢?我想这是这个问题的点...
当设计守则第一实体框架应用程序,做我需要担心的数据库模式?在方法1中,我可以优先考虑数据库设计的代码/模型简化吗?还是应该像方法2一样,在脑海中编写数据库设计类?
谢谢!响应和链接都非常有帮助! –