【问题标题】:Entity Framework 4.1 Foreign Key questionEntity Framework 4.1外键问题
【发布时间】:2011-09-25 10:30:14
【问题描述】:

我在 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
}

现在我已经将下载的外键放在其他两个类中,因为我希望基本上删除空值。这还有一个副产品,即每个下载类允许多个 DownloadBinary 和 DownloadURL 类,这似乎没问题。但从 EF 的角度来看,这似乎是错误的方式,因为 Download 类没有封装 DownloadBinary 和 DownloadURL 类。

我知道我可以搜索 DbContext 并为给定的下载类 ID 检索 DownloadBinary 和 DownloadURL 类,因此我可以正常获取数据。

如果我在 Download 类中持有 DownloadBinary ID 和 DownloadURL ID,我可能会受到空值的影响,这是我这样做的目的..

我真的希望在我的数据输入表单中强制从 Download 到 DownloadBinary 或 DownloadURL 类的一对零或一对关系..

我认为这里没有太大问题,但是更有经验的人会怎么想??

【问题讨论】:

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


    【解决方案1】:

    从DownloadBinary 和DownloadUrl 中删除DownloadID,并将这些类的ID 作为外键映射到Download 的ID。 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 => db.ID) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

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

    【讨论】:

    • 你就是男人! :D 非常感谢,这个方法听起来正是我所需要的 :D
    • 奇怪,这不是让我声明外键约束吗?有什么想法吗?
    • 它只在智能感知中显示 .Map 或 .CascadeOnDelete,没有 .HasForeignKey 的选项。
    • 我修改了答案HasForeignKey 在这种情况下不需要(并且可能)。它是自动推断的。
    猜你喜欢
    • 2023-04-11
    • 2011-08-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多