EF6:导航属性外键到外键

Posted

技术标签:

【中文标题】EF6:导航属性外键到外键【英文标题】:EF6: navigation property foreign key to foreign key 【发布时间】:2017-09-26 11:19:47 【问题描述】:

我有一个旧数据库,我无法用每个实体中具有外键属性的两个实体进行更改:

EntityOne
    ForeignKey1 (pointing to EntityTwo.ForeignKey2)

EntityTwo
    ForeignKey2 (pointing to EntityOne.ForeignKey1)

这些外键指向彼此。如何将这种关系与 EF6 映射?如果不可能,有什么解决方法吗?

我使用一个测试数据库进行了测试,该数据库实际上具有从 EntityOne 到 EntityTwo 的外键关系以及从 EntityTwo 到 EntityOne 的另一个外键关系,并自动生成模型,代码首先来自数据库,但没有在两个表之间创建任何关系:

public partial class EntityFrameworkTesting : DbContext

    public EntityFrameworkTesting()
        : base("name=EntityFrameworkTesting")
    
    

    public virtual DbSet<EntityOne> EntityOne  get; set; 
    public virtual DbSet<EntityTwo> EntityTwo  get; set; 

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    
    

通过一些额外的尝试,我成功地在这些实体之间建立了关系。但是,我不得不从我的 POCO 类中删除外键属性以允许使用 MapKey 函数。我仍然想访问外键,但是当再次添加外键属性时,我收到一条错误消息:“ForeignKey2:名称:类型中的每个属性名称必须是唯一的。属性名称‘ForeignKey2’已经定义。” .

基本上我正在寻找我现在拥有的关系功能,但在我的 POCO 类上添加了外键属性。

modelBuilder.Entity<EntityTwo>()
            .HasRequired(entity => entity.EntityOne)
            .WithRequiredDependent(entity => entity.EntityTwo)
            .Map(m => m.MapKey("ForeignKey2"));

【问题讨论】:

【参考方案1】:

在这种情况下,您希望使用共享主键,这意味着依赖实体的 PK 也是主体实体的 FK(并引用主体实体的 PK),强制执行 1..0 关系。您可以查看this answer 以了解其配置方式。

如果您无法更改数据库架构,那么您在 EF6 中就不走运了。 EF6 不支持 FK 引用除主键之外的任何候选键。

EFCore 支持 FK 引用备用候选键,但仍然不会创建两个相互引用的 FK - 只会创建依赖表中的 FK(或者通过我刚才的有限测试似乎如此)。您可以通过以下 FluentAPI 配置来做到这一点(假设 EntityOne 是主体实体):

modelBuilder.Entity<EntityOne>()
    .HasAlternateKey( eo => eo.ForeignKey1 );

modelBuilder.Entity<EntityTwo>()
    .HasOne( et => et.EntityOne )
    .WithOne( eo => eo.EntityTwo )
    .IsRequired()
    .HasForeignKey<EntityTwo>( et => et.ForeignKey2 )
    .HasPrincipalKey<EntityOne>( eo => eo.ForeignKey1 );

EntityOne.ForeignKey1 应该可以为空。测试时,我不得不手动指定 Has*Key 方法的类型参数,不知道为什么。

【讨论】:

感谢您的“如果您无法更改数据库架构,那么您在 EF6 中就不走运了”——这结束了我的徘徊和疑惑

以上是关于EF6:导航属性外键到外键的主要内容,如果未能解决你的问题,请参考以下文章

JDBCTemplate + MySQL 主键到外键

EF 6 代码首先,在导航属性上使用包含更改外键 ID 会导致“发生引用完整性约束违规”错误

MVC 模型外键导航属性

为可空外键创建导航属性

没有导航属性的EF Code First外键

EF Code First 导航属性 与外键