实体框架4.1外键问题

时间:2011-09-25 10:30:14

标签: database entity-framework foreign-keys entity-framework-4.1 code-first

我正在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类的一对一或零关系。

我在这里看不到太多问题,但更有经验的人会怎么想?

1 个答案:

答案 0 :(得分:1)

DownloadIDDownloadBinary移除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);

DownloadBinaryDownloadUrl都不得在数据库中使用自动生成的ID,因为其ID由Download定义:     modelBuilder.Entity()                 .Property(db =&gt; db.ID)                 .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

modelBuilder.Entity<DownoladUrl>()
            .Property(du => du.ID)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);