【发布时间】:2016-03-14 18:55:39
【问题描述】:
考虑 3 个类:Person、Company 和 File。
Person 和 Company 完全不同且不相关,但它们各自都有一个 File 对象的集合。不管它属于哪个实体,File 始终具有相同的结构。
这个问题是关于如何最好地模拟File 可以拥有的多个多对一关系;在这种情况下,File 可以与Person 或Company 具有多对一关系(但不能在同一个实例中)。
方法一:
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 可以为空的字段。从 DB 设计的角度来看,这似乎是错误的,因为这两个字段中只有一个具有值,而另一个始终为空。添加更多带有文件集合的类会使问题更加严重。
方法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 优先设计中的传统做法。但它需要两个我真的不需要的额外课程......或者我需要吗?我想这就是这个问题的重点......
在设计 Code First Entity Framework 应用程序时,我是否需要担心数据库架构?我可以像方法 1 中那样优先考虑我的代码/模型简单性而不是数据库设计吗?或者我应该像方法 2 那样在编写类时考虑到数据库设计?
【问题讨论】:
标签: c# entity-framework ef-code-first