无法插入具有空外键的实体

Posted

技术标签:

【中文标题】无法插入具有空外键的实体【英文标题】:Cannot insert entity with null foreign key 【发布时间】:2019-02-18 11:28:35 【问题描述】:

想法:键实体,可以被其他键替换,如果发生这种情况,它们的 FK 会相互指向。

public class Key 
    string Id;
    string ReplacesId;
    Key Replaces;
    string ReplacedById;
    Key ReplacedBy;

流利的映射

modelBuilder.Entity<Key>().HasOne(k => k.Replaces)
    .WithOne()
    .HasForeignKey<Key>(k => k.ReplacesId)
    .IsRequired(false);

modelBuilder.Entity<NagKey>().HasOne(k => k.ReplacedBy)
    .WithOne()
    .HasForeignKey<NagKey>(k => k.ReplacedById)
    .IsRequired(false);

问题:尝试保存实体,失败,重复外键错误(为空)如下:

System.Data.SqlClient.SqlException:无法在具有唯一索引“IX_Keys_ReplacedById”的对象“dbo.Keys”中插入重复的键行。重复键值为 ()。该语句已终止。

【问题讨论】:

【参考方案1】:

通过使索引不唯一来解决:

modelBuilder.Entity<Key>()
    .HasIndex(x => x.ReplacedById)
    .IsUnique(false)
    .HasFilter(null);

modelBuilder.Entity<Key>()
    .HasIndex(x => x.ReplacesId)
    .IsUnique(false)
    .HasFilter(null);

【讨论】:

以上是关于无法插入具有空外键的实体的主要内容,如果未能解决你的问题,请参考以下文章

实体框架代码优先空外键

实体框架中与代码优先外键的更改冲突

数据库建模:按实体类型的空外键

Hibernate 对具有复合键的子实体执行错误的插入顺序

具有该实体外键的学说实体

ssh关于含有外键的传值中无法识别正确的action的原因和解决办法