允许外键GUID为空

本文关键字:为空 GUID 许外键 | 更新日期: 2023-09-27 18:24:01

我想创建一个类型为GUID的可为null的外键,如下

[ForeignKey("CreatedBy")]
[Display(Name = "Created by")]
public Guid? CreatedById { get; set; }
public virtual User CreatedBy { get; set; }

但是,当我添加迁移和更新数据库时,它并不允许SQL中的表设计为null。

有没有其他方法可以让它先允许null通过模型?

允许外键GUID为空

不确定为什么你的不起作用,或者你是否发现了。我们有几乎相同的设计,我们得到了可为null的外键。我们通常使用Fluent配置,但我们没有任何关于这些属性的配置,因为EF在没有帮助的情况下计算出了它们。也许删除ForeignKey属性可以修复它。

public virtual User CreateUser { get; set; }
public Guid? CreateUserId { get; set; }

添加迁移时,会调用OnModelCreating方法来确定当前模型配置。在那里,如果你有这样的代码:

  modelBuilder.Entity<ParentEntity>()
        .HasMany(e => e.ChildEntity)
        .WithRequired(e => e.CreatedBy)
        .HasForeignKey(e => e.CreatedById);

那么您告诉EFCreatedById是必需的,因此不可为null(从SQL的角度来看)。

要允许它为null,请将代码更改为:

  modelBuilder.Entity<ParentEntity>()
        .HasMany(e => e.ChildEntity)
        .WithOptional(e => e.CreatedBy)
        .HasForeignKey(e => e.CreatedById);

请参阅:OnModelCreating和非自动迁移之间的关系如何?