我正在EF 4.1 Code First中使用电子商务数据库设计。
我认为我认为自己是合理的,但不确定......
考虑:
class Download
{
int ID
string Mime
string Filename
string Extension
}
class DownloadBinary
{
int ID
int DownloadID
Download Download
byte[] Binary
}
class DownloadURL
{
int ID
int DownloadID
Download Download
string URL
}
现在我已将外键下载放在其他两个类中,因为我希望基本上删除空值。此外,这还有每个Download类允许多个DownloadBinary和DownloadURL类的副产品,这似乎没问题。但从EF的角度来看,这似乎是错误的方式,因为Download类没有封装DownloadBinary和DownloadURL类。
我知道我可以搜索DbContext并为给定的下载类ID退出DownloadBinary和DownloadURL类,这样我就可以获得数据了。
如果我在Download类中持有DownloadBinary ID和DownloadURL ID,我可能会遇到空值,这是我这样做的意思..
我真的希望在我的数据输入表单中执行从Download到DownloadBinary或DownloadURL类的一对一或零关系。
我在这里看不到太多问题,但更有经验的人会怎么想?
答案 0 :(得分:1)
从DownloadID
和DownloadBinary
移除DownloadUrl
,并将这些类的ID
映射为ID
Download
的外键。 EF仅支持主键上的一对一关系,因为它不支持唯一键。
modelBuilder.Entity<Download>()
.HasOptional(d => d.DownloadBinary)
.WithRequired(db => db.Download);
modelBuilder.Entity<Download>()
.HasOptional(d => d.DownloadUrl)
.WithRequired(du => du.Download);
DownloadBinary
和DownloadUrl
都不得在数据库中使用自动生成的ID,因为其ID由Download
定义:
modelBuilder.Entity()
.Property(db =&gt; db.ID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
modelBuilder.Entity<DownoladUrl>()
.Property(du => du.ID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);